Awesome nested set cheat sheet

Ankit gupta edited this page Aug 6, 2013 · 12 revisions

Basic Usage

Create a root node:

science = Category.create!(:name => 'Science')

Put a new thing inside this root node:

physics = Category.create!(:name => 'Physics')
physics.move_to_child_of(science)

Put another thing inside the "physics" node:

gravity = Category.create!(:name => 'Gravity')
gravity.move_to_child_of(physics)

Reload the root node:

science.reload

Now you should have something that resembles this:

science
'-- physics
    '-- gravity

Advanced Usage

Accessing levels without a hit to the DB:

Category.each_with_level(Category.root.self_and_descendants) do |category, level|
  ...
end

Accessing Data

Class methods

Category.root   the first root node
Category.roots  all root nodes

Instance methods

my_cat.root                  root for this node
my_cat.level                 the level of this object in the tree (e.g. root = 0)
my_cat.parent                the node's immediate parent
my_cat.children              array of immediate children (just those in the next level)
my_cat.ancestors             array of all parents, parents' parents, etc, excluding self
my_cat.self_and_ancestors    array of all parents, parents' parents, etc, including self
my_cat.siblings              array of brothers and sisters (all at that level), excluding self
my_cat.self_and_siblings     array of brothers and sisters (all at that level), including self
my_cat.descendants           array of all children, children's children, etc., excluding self
my_cat.self_and_descendants  array of all children, children's children, etc., including self
my_cat.leaves                array of all descendants that have no children

Instance methods: Predicates (these don't need to hit the DB to respond)

my_cat.root?                         true if this is a root node
my_cat.child?                        true if this is a child node (i.e. it has a parent)
my_cat.is_ancestor_of?(obj)          true if nested by any obj
my_cat.is_or_is_ancestor_of?(obj)    true if nested by any obj or self is obj
my_cat.is_descendant_of?(obj)        true if self is nested under obj
my_cat.is_or_is_descendant_of?(obj)  true if self is nested under obj or self is obj
my_cat.leaf?                         true if this is a leaf node (i.e. it has no children)
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.