【发布时间】:2015-02-08 22:13:20
【问题描述】:
我有一个模型标签,它是一个树模型(使用 closure_tree),感谢 gem,我可以执行以下操作:
Tag.includes(:children).first
急切地加载它的孩子。现在,我有一个实例方法,它也使用孩子。因此,当我通过上述查询获得标签时,遍历标签及其子项并调用此实例方法,bullet gem 抱怨我正在执行 N+1 查询并建议我使用include(children)。出现这种情况是因为我没有加载children的children,所以在调用实例方法的时候,我对一级标签的每个子标签的children进行了单独的查询。
我可以通过以下方式解决这个问题:
Tag.includes(children: :children).first
在这种情况下,ActiveRecord 急切地加载标签、它的子代和它的子代的子代。但是,如果只有 3 代,这将起作用 - 标签是祖父母,然后是父母(它们是根标签的孩子)和孙子(它们是根标签的孩子的孩子)。如果我有 4 代,那么我必须这样做:
Tag.includes(children: {children: :children}).first
因此,如果我可以确定根标记的最远孙子的depth,有没有办法有条件地构造我的查询 - 如果深度为 2,则使用 includes(:children),如果深度为 3 - 使用 @987654331 @等等?
【问题讨论】:
标签: ruby-on-rails activerecord eager-loading hashtree