我有一个属于类别的Entry模型 . Category模型使用祖先,以便我可以嵌套Categories .
我想根据其根类别对选择的条目进行分组 . 我遇到的问题是,为了做到这一点,rails会对每个条目执行查询以获取根类别 . 因此,如果我有20条记录,它将按根类别执行20个查询 .
我已经通过急切加载类别减少了查询数量(如下所示),但我无法弄清楚如何急切加载类别的根目录 .
这是我正在使用的代码:
Controller
@entries = current_user.entries.includes(:category)
@entries_by_category = @entries.group_by { |entry| entry.category.root }
entry.rb
class Entry < ActiveRecord::Base
belongs_to :category
end
category.rb
class Category < ActiveRecord::Base
has_ancestry
has_many :entries
end
我已经尝试在类别模型上设置默认范围,如下所示: default_scope { includes(:ancestry) }
. 但是,没有找到如何在原始查询中使用 includes()
来包含类别和类别的根 .
作为一些额外的信息,类别只能嵌套2个级别(只是类别和子类别) . 所以root在技术上意味着父,它不必遍历多个级别 .
有任何想法吗?
1 回答
我有一个非常类似的问题,除了我想要加载类别的
path
而不是root
. 不幸的是,急切加载仅适用于关联 . Ancestry导航器(parent
,root
,path
,ancestors
等)都是方法,而不是关联,所以你不能急于加载它们 .我的解决方案是急切加载条目的类别关联,然后在
Category
上使用模型级缓存(请参阅Railscast #115)来缓存path
(在您的情况下可以修改为root
):category.rb
entries_controller.rb
views/entries/index.html.haml
希望有所帮助 .