获取所有后代类别的Rails方法

时间:2011-09-07 19:08:40

标签: ruby-on-rails ruby

之前,我看到了一个简洁而优秀的方法来获取rails应用程序中给定类别的所有祖先类别:

def ancestors
  result = []
  c = self
  while c.parent
    result.unshift(c.parent)
    c = c.parent
  end
  result
end   

现在我想弄清楚如何获得给定类别的所有后代类别(孩子,孩子的孩子等)。我能得到的最接近的类别如下,但我仍然有最终结果数组混乱的问题。顶级数组未关闭。我已经打了好几个小时,我不确定如何解决它。

def descendants

  result = []
  c = self

  for child in c.children
   result.push(child)
   if(child.children.any?)
    result.push(child.descendants)
   end
  end

  result

end

2 个答案:

答案 0 :(得分:5)

试试这个:

def descendants
  children.map(&:descendants).flatten
end

def ancestors
  [parent, parent.try(:ancestors)].compact.flatten
end

手动树遍历会影响性能。您应该考虑使用像ancestry这样的宝石,它可以很好地表示树形。

修改1

如果您使用的是awesome_nested_set gem,请注意它在AR实例上有ancestorsdescendants方法。您可以使用ruby对这些方法的结果进行排序(如果您正在处理一小组<100)。

category.descendants.sort_by(&:name)

答案 1 :(得分:0)

另外,acts_as_tree是Rails的一个伟大的宝石:https://github.com/rails/acts_as_tree

我将它用于此目的并使其全部自动化。