2

Ancestry 有很多很棒的作用域和方法,包括node.depth(它返回一个深度级别——即根节点为 0,子节点为 1,等等)。

它还具有一些允许您按深度遍历树的范围,例如node.subtree(:to_depth => 2).

但我没有看到任何表明如何计算/检索整个树的总深度的东西 - 从根到最后一个节点。

我唯一能想到的就是total_depth_cache在我的模型上创建一个列,当添加一个新的孩子时,它会增加它。但是然后我必须编写逻辑来管理它(即,每当删除所有子级时,它都会递减 - 如果只有 1 级,但如果删除了具有 3 级子级的子级,则必须更新深度因此)。这很快就会变得非常复杂。

有没有更简单的方法来做到这一点?

4

2 回答 2

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

编辑:澄清一下,如果没有子节点,该方法将返回节点的当前深度,否则它将在当前节点的所有子节点上调用自身并返回最大的结果。最终结果将是树中最大的“深度”值。

于 2015-01-01T21:03:52.703 回答
2

有许多方法可以检索祖先树的深度。最易读的一个是:

node.subtree.select(&:is_childless?).map(&:depth).max

这会找到所有叶节点的最大深度。

于 2015-08-25T11:25:15.410 回答