之前,我看到了一个简洁而优秀的方法来获取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
答案 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实例上有ancestors
和descendants
方法。您可以使用ruby对这些方法的结果进行排序(如果您正在处理一小组<100)。
category.descendants.sort_by(&:name)
答案 1 :(得分:0)
另外,acts_as_tree是Rails的一个伟大的宝石:https://github.com/rails/acts_as_tree
我将它用于此目的并使其全部自动化。