是否可以使用acts_as_tree来支持急切加载?

时间:2009-10-01 15:09:18

标签: ruby-on-rails preload acts-as-tree

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我在过去和IIRC中已经研究过这个问题我发现你可以通过将表格与 n 时间连接在一起来加载具有单个SQL查询的已知深度的树;但是,无法加载任意大小的完整树。因此需要嵌套集设计。

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

答案 1 :(得分:0)

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

 RootModel.find(1).preload_tree

详细说明在此blog