2012-05-03 6 views
5

私はこのようなシナリオがあります。各ポストは別のオブジェクトに属しmongoid - 使用しては1..N参照関係にあるオブジェクトの子供たちを選択することが含まれる

blog.posts 

は、belongs_toの中で(タグ言う、has_manyの関係を)ので、私は行うことができます、

tag.posts 

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

私は私が行うことができますmongoidドキュメントに気づい:

それは提供私に(ブログに所属し、またポストに関連付けられた各タグを取得し、アイデンティティ・マップに入れて、すべての記事を取得します
Post.includes(:tag).where(:blog_id: blog.id) 

有効)。

blog.posts 

を何とか私は上記のやりたいクエリを再定義:問題がある

、私がやりたいです。それを行う方法はありますか?私は拡張子を定義することによって、これを軽減しています現時点では

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

私は

blog.posts.with_tags 

を行うが、私は

blog.posts 

は上記を行うことを好むようにデフォルトでは

乾杯。

答えて

7

このスコープを使用して、特定のデフォルトスコープを達成できます。だからあなたのポストモデルでは、あなたがそのようなモデルを定義することができます。

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

あなたはBlog.postsのような記事を、取得するためのクエリを実行するたびにその方法を、mongoidもそれぞれに関連付けられたすべてのタグを取得するクエリを生成します。役職。

+0

他にもこれを行う方法はありますか?つまり、モンゴイドのオブジェクトからですか? – K2xL

関連する問題