3

正如标题所述,我想基于模型渲染一个 --treeul并且只访问数据库一次。我正在使用 Ruby on Rails 4.1。liawesome_nested_set

我的查询如下所示:

Page.root.self_and_descendants.where('depth < ?', 2)

什么是一种有效的方法来做到这一点?

如何在不丢失 where 条件的情况下递归迭代它?例如,当我询问每个实例时Page,如果它是叶子(page_instance.leaf?下一步?

这个问题与站点地图有关。

4

1 回答 1

5

如果您真的想在没有任何额外数据库查询的情况下执行此操作,则可能需要将它们全部获取并将其转换为数组,.to_a然后通过迭代和构造哈希在内存中重新创建树结构。

然而,有一种叫做“闭包树”的东西,它是一种非常强大的方法,可以在 SQL 中非常快速地构建树结构,一些比我聪明得多的人想出来了。有一个 ruby​​/rails gem 可以为您完成它,它的一个功能是在单个SELECT语句中获取整个树,并将其放入嵌套哈希结构中,这对于您正在谈论的递归迭代来说是完美的. 您可能想研究一下:https ://github.com/mceachen/closure_tree

但实际上,如果你的树不是那么大,你可能想要避免“过早的优化”,而只是简单的方法,访问数据库几到几十次(如果你总是要停在级别 2,最大查询数是根的子节点数)。

于 2014-07-28T20:32:06.443 回答