Rob*_*bin 3 ruby-on-rails nested-sets awesome-nested-set
正如标题状态,我想渲染ul-li基于一个-树awesome_nested_set模型,并击中了数据库只有一次。我正在使用 Ruby on Rails 4.1。
我的查询如下所示:
Page.root.self_and_descendants.where('depth < ?', 2)
Run Code Online (Sandbox Code Playgroud)
这样做的有效方法是什么?
如何在不丢失 where 条件的情况下递归遍历它?例如,当我询问每个Page实例时,如果它是叶子 ( page_instance.leaf?),那么它不会在深度为 2 处停止,但在我挖掘深度超过 2 之前它不会再次访问数据库。有人可以帮助我解决下一步?
这个问题与站点地图有关。
如果您真的想在没有任何额外 db 查询的情况下执行此操作,则可能需要将它们全部获取并将其转换为数组,.to_a然后通过迭代和构建哈希在内存中重新创建树结构。
然而,有一种叫做“闭包树”的东西,它是在 SQL 中非常快速地构建树结构的一种非常强大的方法,有些人比我想的要聪明得多。有一个 ruby/rails gem 可以为您完成它,其功能之一是在单个SELECT语句中获取整个树,并将其放入嵌套的哈希结构中,这将非常适合您正在谈论的递归迭代. 你可能想看看它:https : //github.com/mceachen/closure_tree
但实际上,如果您的树不是那么大,您可能希望避免“过早优化”,只需以简单的方式进行,点击数据库几到几十次(如果您总是要停在级别 2,最大查询数是根的孩子数)。
| 归档时间: |
|
| 查看次数: |
1393 次 |
| 最近记录: |