Ancestry有许多精彩的范围和方法,包括node.depth
(返回深度级别 - 即根节点为0,子节点为1等)。
它还有一些范围允许您按深度遍历树,例如node.subtree(:to_depth => 2)
。
但我没有看到任何指示如何计算/检索整个树的总深度 - 从根到最后一个节点。
我唯一能想到的是在我的模型上创建一个total_depth_cache
列,当添加一个新子项时,它会增加。但是后来我必须写出管理它的逻辑(即每当所有孩子被删除时,它会减少 - 如果只有1个级别,但是如果有3级孩子的孩子被删除,则必须更新深度因此)。这很快就会变得非常复杂。
有更简单的方法吗?
答案 0 :(得分:2)
这里是您可以添加到模型的last_depth
递归方法...
class Node
def last_depth
if child_ids.empty?
return depth
else
return children.map{|c| c.last_depth}.max
end
end
end
编辑:澄清一下,如果节点没有子节点,该方法将返回节点的当前深度,否则它将在当前节点的所有子节点上调用自身并返回最大结果。最终结果将是最大的"深度"树中的价值。