私はツリーモデル(を使用closure_tree
)であるモデルタグを持っており、gemのおかげで次のようなことができます:
Tag.includes(:children).first
その子を熱心にロードします。これで、子も使用するインスタンス メソッドができました。したがって、前述のクエリでタグを取得し、タグとその子を反復処理してこのインスタンス メソッドを呼び出すと、bullet
gem は N+1 クエリを実行していると不平を言い、include(children)
. これは、子の子をロードしていないために発生するため、インスタンス メソッドを呼び出すときに、第 1 レベルのタグの各サブタグの子に対して個別のクエリを作成します。
次のようにすることでこれを解決できます。
Tag.includes(children: :children).first
この場合、ActiveRecord はタグ、その子、およびその子の子を積極的に読み込みます。ただし、これは 3 世代しかない場合に機能します。つまり、タグが祖父母であり、親 (ルート タグの子) と孫 (ルート タグの子の子) です。たとえば、私が4世代を持っている場合、私がしなければならないよりも:
Tag.includes(children: {children: :children}).first
したがってdepth
、ルート タグの最も遠い孫の を特定できる場合、条件付きでクエリを作成する方法はありますか? 深さが 2 の場合は を使用includes(:children)
し、深さが 3 の場合は を使用includes(children: :children)
します。