如何轻松检索祖先树的总深度?
How do I easily retrieve the total depth of a tree in ancestry?
Ancestry 有许多很棒的作用域和方法,包括 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
这将找到所有叶节点的最大深度。
Ancestry 有许多很棒的作用域和方法,包括 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
这将找到所有叶节点的最大深度。