我有一个模型标签,它是一个树模型(使用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 - 使用includes(children: :children)
等等?