【发布时间】:2015-01-01 00:50:56
【问题描述】:
Ancestry 有许多很棒的作用域和方法,包括 node.depth(它返回一个深度级别 - 即根节点为 0,子节点为 1,等等)。
它还有一些范围可以让你按深度遍历树,例如node.subtree(:to_depth => 2).
但我没有看到任何指示如何计算/检索整个树的总深度 - 从根到最后一个节点。
我唯一能想到的就是在我的模型上创建一个total_depth_cache 列,当添加一个新子时,它会增加它。但是然后我必须编写逻辑来管理它(即,每当删除所有子级时,它就会递减 - 如果只有 1 级,但如果删除了具有 3 级子级的子级,则必须更新深度因此)。这很快就会变得相当复杂。
有没有更简单的方法来做到这一点?
【问题讨论】:
-
计算孩子的数量就足够了吗?
node.descendant_ids.count? -
不...这不起作用...因为它包括兄弟姐妹。即如果
node A有 2 个孩子,每个孩子有 1 个孩子。node.descendant_ids.count将返回 4,而总深度应为 3(即根 -> 子 -> 孙),如果这有意义的话。 -
有点臭。您可以使用
total_depth_cache,但您必须通过遍历所有子代,然后是父代的父代等,在父代的 after_create 和 after_destroy 上重新计算它,然后当您看到没有变化时停止,因为父代也不会改变.如果它是一棵易变的树并且您不需要经常使用 total_depth,那么可能会更好地遍历所有子级以“根据需要”计算 total_depth。如果不检查所有其他子分支,则无法确定父级缓存值是否需要更改。 -
@SteveTurczyn 这有点像我想的......但那样有点糟糕。我可能只需要那样做。我希望有
max_depth或last_depth方法或其他东西。这样会更容易。
标签: ruby-on-rails ruby-on-rails-4 ancestry