如何轻松检索祖先树的总深度?

How do I easily retrieve the total depth of a tree in ancestry?

A​​ncestry 有许多很棒的作用域和方法,包括 node.depth(返回深度级别 - i.e。0 表示根节点,1 表示子节点等)。

它还有一些作用域,允许您按深度遍历树,e.g。 node.subtree(:to_depth => 2).

但我没有看到任何指示如何计算/检索整个树的总深度的信息 - 从根到最后一个节点。

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

有更简单的方法吗?

这里有一个 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

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

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

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

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