Ruby on rails 如何从一个很棒的嵌套集合渲染一棵树,并且只点击数据库一次?

Ruby on rails 如何从一个很棒的嵌套集合渲染一棵树,并且只点击数据库一次?,ruby-on-rails,nested-sets,awesome-nested-set,Ruby On Rails,Nested Sets,Awesome Nested Set,正如标题所述,我想基于awesome\u嵌套集模型呈现一个ul-li-树,并只点击数据库一次。我正在使用RubyonRails4.1 我的查询如下所示: Page.root.self_and_descendants.where('depth < ?', 2) Page.root.self_和_子体。其中('depth

正如标题所述,我想基于
awesome\u嵌套集
模型呈现一个
ul
-
li
-树,并只点击数据库一次。我正在使用RubyonRails4.1

我的查询如下所示:

Page.root.self_and_descendants.where('depth < ?', 2)
Page.root.self_和_子体。其中('depth<?',2)
这样做的有效方法是什么

如何在不丢失where条件的情况下递归地遍历它?例如,当我询问每个
页面
实例时,如果它是一个叶子(
Page\u instance.leaf?
),那么它不会在深度为2时停止,但在挖掘深度超过2之前,它不会再次命中数据库。有人能帮我做下一步吗


这个问题与网站地图有关

如果您真的想在不使用任何额外db查询的情况下执行此操作,则可能需要获取所有db查询,并使用
.to\u a
将其转换为数组,然后通过迭代和构造哈希在内存中重新创建树结构

然而,有一种叫做“闭包树”的东西,它是一种非常强大的方法,可以在SQL中非常快速地完成树结构,这是一些比我聪明得多的人所发现的。有一个ruby/rails gem可以为您实现这一点,它的一个特性是在一个
SELECT
语句中获得一个完整的树,并将其放入一个嵌套的哈希结构中,该结构非常适合您所讨论的递归迭代。您可能想调查一下:


但实际上,如果您的树没有那么大,您可能希望避免“过早优化”,只需以简单的方式进行,对数据库进行几到几十次访问(如果您总是停留在第2级,最大查询数就是根的子级数)。

感谢您分享您的想法。也许我会这样做,我只是再点击数据库几次,然后永远缓存呈现的页面,直到我的树发生变化。