From b0630673213ed2bee99883cb9197ddf6457a3fac Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 9 Sep 2005 08:01:44 +0000 Subject: Added the instance methods #root and #ancestors on acts_as_tree and fixed siblings to not include the current node #2142, #2140 [coffee2code] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2163 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/lib/active_record/acts/tree.rb | 38 +++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'activerecord/lib/active_record') diff --git a/activerecord/lib/active_record/acts/tree.rb b/activerecord/lib/active_record/acts/tree.rb index 2463a1209a..5fc7ddf41c 100644 --- a/activerecord/lib/active_record/acts/tree.rb +++ b/activerecord/lib/active_record/acts/tree.rb @@ -16,16 +16,23 @@ module ActiveRecord # Example : # root # \_ child1 - # \_ sub-child1 + # \_ subchild1 + # \_ subchild2 # # root = Category.create("name" => "root") - # child1 = root.children.create("name" => "child1") - # subchild1 = child1.children.create("name" => "subchild1") + # child1 = root.children.create("name" => "child1") + # subchild1 = child1.children.create("name" => "subchild1") # - # root.parent # => nil + # root.parent # => nil # child1.parent # => root # root.children # => [child1] # root.children.first.children.first # => subchild1 + # + # In addition to the parent and children associations, the following instance methods are added to the class + # after specifying the act: + # * siblings: Return all the children of the parent excluding the current node ([ subchild2 ] when called from subchild1) + # * ancestors: Returns all the ancestors of the current node ([child1, root] when called from subchild2) + # * root: Returns the root of the current node (root when called from subchild2) module ClassMethods # Configuration options are: # @@ -48,15 +55,26 @@ module ActiveRecord end END + # Returns list of ancestors, starting from parent until root. + # + # subchild1.ancestors # => [child1, root] + define_method(:ancestors) do + node, nodes = self, [] + nodes << node = node.parent until not node.has_parent? + nodes + end + + define_method(:root) do + node = self + node = node.parent until not node.has_parent? + node + end + define_method(:siblings) do - if parent - self.class.find(:all, :conditions => [ "#{configuration[:foreign_key]} = ?", parent.id ], :order => configuration[:order]) - else - self.class.roots - end + ( has_parent? ? parent.children : self.class.roots ) - [self] end end end end end -end \ No newline at end of file +end -- cgit v1.2.3