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

时间:2015-01-01 00:50:57

标签: ruby-on-rails ruby-on-rails-4 ancestry

Ancestry有许多精彩的范围和方法,包括node.depth(返回深度级别 - 即根节点为0,子节点为1等)。

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

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

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

有更简单的方法吗?

1 个答案:

答案 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

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