5

次のようなシナリオがあります。

blog.posts

ここで、各投稿は別のオブジェクト、たとえば Tag に属します (belongs_to、has_many 関係)。

tag.posts

N+1 問題を防ぐために、blog.posts を実行できるようにしたいのですが、各投稿に関連付けられた各タグも取得して、2 つのクエリが生成されるようにします。1 つは投稿用で、もう 1 つはすべてのタグ用です (投稿に属する各 tag_id )。

私ができるmongoidのドキュメントで気づいた:

Post.includes(:tag).where(:blog_id: blog.id)

これにより、ブログに属するすべての投稿が取得され、投稿に関連付けられた各タグが取得され、ID マップに配置されます (有効になっている場合)。

問題は、私がやりたいことです:

blog.posts

そして、どういうわけかクエリを再定義して、上記のことを行います。それを行う方法はありますか?

現時点では、拡張機能を定義することでこれを軽減しています:

has_many :posts do
  def with_tags 
    includes(:tag)
  end
end

私がするように

blog.posts.with_tags

しかし、私はそれを好むだろう

blog.posts

はデフォルトで上記を行います。

乾杯。

4

1 に答える 1

7

スコープを使用して、特定のデフォルト スコープを実現できます。したがって、Post モデルでは、次のようにモデルを定義できます。

class Post
   belongs_to :tag
   default_scope includes(:tag)
end

そうすれば、Blog.posts のような投稿を取得するためのクエリを実行するたびに、mongoid は各投稿に関連付けられたすべてのタグを取得するためのクエリも生成します。

于 2012-05-04T16:42:18.967 に答える