Module: CollectiveIdea::Acts::NestedSet::Model::InstanceMethods

Defined in:
lib/awesome_nested_set/awesome_nested_set.rb

Overview

Any instance method that returns a collection makes use of Rails 2.1’s named_scope (which is bundled for Rails 2.0), so it can be treated as a finder.

category.self_and_descendants.count
category.ancestors.find(:all, :conditions => "name like '%foo%'")

Instance Method Summary collapse

Instance Method Details

#ancestorsObject

Returns an array of all parents



261
262
263
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 261

def ancestors
  without_self self_and_ancestors
end

#child?Boolean

Returns true is this is a child node

Returns:

  • (Boolean)


244
245
246
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 244

def child?
  !parent_id.nil?
end

#descendantsObject

Returns a set of all of its children and nested children



294
295
296
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 294

def descendants
  without_self self_and_descendants
end

#is_ancestor_of?(other) ⇒ Boolean

Returns:

  • (Boolean)


306
307
308
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 306

def is_ancestor_of?(other)
  self.left < other.left && other.left < self.right && same_scope?(other)
end

#is_descendant_of?(other) ⇒ Boolean

Returns:

  • (Boolean)


298
299
300
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 298

def is_descendant_of?(other)
  other.left < self.left && self.left < other.right && same_scope?(other)
end

#is_or_is_ancestor_of?(other) ⇒ Boolean

Returns:

  • (Boolean)


310
311
312
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 310

def is_or_is_ancestor_of?(other)
  self.left <= other.left && other.left < self.right && same_scope?(other)
end

#is_or_is_descendant_of?(other) ⇒ Boolean

Returns:

  • (Boolean)


302
303
304
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 302

def is_or_is_descendant_of?(other)
  other.left <= self.left && self.left < other.right && same_scope?(other)
end

#leaf?Boolean

Returns:

  • (Boolean)


239
240
241
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 239

def leaf?
  !new_record? && right - left == 1
end

#leavesObject

Returns a set of all of its nested children which do not have children



276
277
278
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 276

def leaves
  descendants.where("#{self.class.quoted_table_name}.#{quoted_right_column_name} - #{self.class.quoted_table_name}.#{quoted_left_column_name} = 1")
end

#leftObject

Value of the left column



225
226
227
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 225

def left
  self[left_column_name]
end

#left_siblingObject

Find the first sibling to the left



322
323
324
325
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 322

def left_sibling
  siblings.where(["#{self.class.quoted_table_name}.#{quoted_left_column_name} < ?", left]).
          order("#{self.class.quoted_table_name}.#{quoted_left_column_name} DESC").last
end

#levelObject

Returns the level of this object in the tree root level is 0



282
283
284
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 282

def level
  parent_id.nil? ? 0 : ancestors.count
end

#move_leftObject

Shorthand method for finding the left sibling and moving to the left of it.



333
334
335
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 333

def move_left
  move_to_left_of left_sibling
end

#move_possible?(target) ⇒ Boolean

Returns:

  • (Boolean)


362
363
364
365
366
367
368
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 362

def move_possible?(target)
  self != target && # Can't target self
  same_scope?(target) && # can't be in different scopes
  # !(left..right).include?(target.left..target.right) # this needs tested more
  # detect impossible move
  !((left <= target.left && right >= target.left) or (left <= target.right && right >= target.right))
end

#move_rightObject

Shorthand method for finding the right sibling and moving to the right of it.



338
339
340
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 338

def move_right
  move_to_right_of right_sibling
end

#move_to_child_of(node) ⇒ Object

Move the node to the child of another node (you can pass id only)



353
354
355
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 353

def move_to_child_of(node)
  move_to node, :child
end

#move_to_left_of(node) ⇒ Object

Move the node to the left of another node (you can pass id only)



343
344
345
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 343

def move_to_left_of(node)
  move_to node, :left
end

#move_to_right_of(node) ⇒ Object

Move the node to the left of another node (you can pass id only)



348
349
350
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 348

def move_to_right_of(node)
  move_to node, :right
end

#move_to_rootObject

Move the node to root nodes



358
359
360
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 358

def move_to_root
  move_to nil, :root
end

#parent_idObject

Value of the parent column



220
221
222
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 220

def parent_id
  self[parent_column_name]
end

#rightObject

Value of the right column



230
231
232
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 230

def right
  self[right_column_name]
end

#right_siblingObject

Find the first sibling to the right



328
329
330
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 328

def right_sibling
  siblings.where(["#{self.class.quoted_table_name}.#{quoted_left_column_name} > ?", left]).first
end

#rootObject

Returns root



249
250
251
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 249

def root
  self_and_ancestors.where(parent_column_name => nil).first
end

#root?Boolean

Returns true if this is a root node.

Returns:

  • (Boolean)


235
236
237
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 235

def root?
  parent_id.nil?
end

#same_scope?(other) ⇒ Boolean

Check if other model is in the same scope

Returns:

  • (Boolean)


315
316
317
318
319
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 315

def same_scope?(other)
  Array(acts_as_nested_set_options[:scope]).all? do |attr|
    self.send(attr) == other.send(attr)
  end
end

#self_and_ancestorsObject

Returns the array of all parents and self



254
255
256
257
258
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 254

def self_and_ancestors
  nested_set_scope.where([
    "#{self.class.quoted_table_name}.#{quoted_left_column_name} <= ? AND #{self.class.quoted_table_name}.#{quoted_right_column_name} >= ?", left, right
  ])
end

#self_and_descendantsObject

Returns a set of itself and all of its nested children



287
288
289
290
291
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 287

def self_and_descendants
  nested_set_scope.where([
    "#{self.class.quoted_table_name}.#{quoted_left_column_name} >= ? AND #{self.class.quoted_table_name}.#{quoted_right_column_name} <= ?", left, right
  ])
end

#self_and_siblingsObject

Returns the array of all children of the parent, including self



266
267
268
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 266

def self_and_siblings
  nested_set_scope.where(parent_column_name => parent_id)
end

#siblingsObject

Returns the array of all children of the parent, except self



271
272
273
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 271

def siblings
  without_self self_and_siblings
end

#to_textObject



370
371
372
373
374
# File 'lib/awesome_nested_set/awesome_nested_set.rb', line 370

def to_text
  self_and_descendants.map do |node|
    "#{'*'*(node.level+1)} #{node.id} #{node.to_s} (#{node.parent_id}, #{node.left}, #{node.right})"
  end.join("\n")
end