2

使用acts_as_tree 我希望能够通过一次SQL 调用预加载完整的子层次结构完整的树。为此,我在表中添加了一个 tree_id,它贯穿该树中的所有后代。

我曾探索过acts_as_nested_set(实际上是awesome_nested_set)作为一种可能性,但由于我将树移植到其他树中,我发现将嵌套集用于我的目的执行了太多更新。与acts_as_versioned 一起,这对我所追求的设计来说是一个不可接受的复杂性。就我的目的而言,我相信acts_as_tree 更适合。

我唯一的问题是抓取完整的层次结构树。ActiveRecord 的 :include 选项适用于 :children 但不适用于 :descendants。我满足于编写自己的手动检索和映射关联的方法。有关如何完成此操作的任何指导或示例?

从我的角度来看,我搁置使用树(支持抓取整个结构化树)的嵌套集的唯一好处是选择性地抓取树的任何子部分。我没关系。

我希望避免的解决方案是消除与树一起出现的 :children 关联,并定义和手动加载在每个树节点上定义的子数组。

4

2 回答 2

1

我过去曾对此进行过研究,IIRC 我发现您可以通过将表与自身连接n次来使用单个 SQL 查询加载已知深度的树;但是,不可能加载任意大小的完整树。因此需要嵌套集合设计。

如果您的数据集相对较小,您可以获取所有记录并在内存中重新组装树。也许这就足够了?

于 2009-10-01T17:59:31.973 回答
0

你可以index_tree Gem,它为树提供了一个急切的加载方法

 RootModel.find(1).preload_tree

详细描述在这个博客

于 2015-03-26T22:11:12.107 回答