-
-
Notifications
You must be signed in to change notification settings - Fork 488
Awesome nested set cheat sheet
Ankit gupta edited this page Aug 6, 2013
·
12 revisions
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
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)