1

Ruby on Rails 3.1を実行しています。私はincludesメソッドを使用しています。私は熱心なロードされたコレクションでwhereメソッドを呼び出すと、eager loadedコレクションでそのオブジェクトを見つけるのではなく、関連付けられたオブジェクトをリロードする理由を理解したいと思います。すべての関連するオブジェクトはすでに熱心に読み込まれているので、whereメソッドはではありません。はこれらのオブジェクトをリロードするためにデータベースにヒットします。「where」メソッドを読み込んで使用する際のトラブル

、私は次のようきている:私は

# CASE 1: 

article_categories.each do |article_category| 
    article_category.comments.map(&:title) 
end 

積極的なロードを実行する場合、期待どおり

article_categories = 
    article 
    .categories 
    .where(:user_id => @current_user.id) 
    .includes(:comments) 

の作品: "N + 1クエリー問題は" 避けています。しかし、上記のコードでは、ではなく ":user_id == @current_user.id"ではないコメントタイトルも返されますが、これらのタイトルは一切検索したくありません。私は熱心なロードを使用して、私はすでにすべてのコメントを取得することを考えているので

だから、私は次のコードのように、さらにwhere(:user_id => @current_user.id)ステートメントを使用:この場合、積極的なロードには、

# CASE 2: 

article_categories.each do |article_category| 
    article_category.comments.where(:user_id => @current_user.id).map(&:title) 
end 

しかしませありませんは期待通りに動作します: "N + 1クエリの問題"はではなく、は避けられますが、コメントは ":user_id == @current_user.id"です!

私は「:user_id == @current_user.id」とイーガーローディングコメント(がどのように私は積極的なロードから利用することによって、ということができますか?)したいと私はwhere文はイーガーローディング効果をキャンセルする理由を理解したいと思います。

答えて

3

ケース1の場合、where句はカテゴリにのみ適用されます。コメントにも適用したい場合は、次のようにしてください:

article_categories = 
    article 
    .categories 
    .includes(:comments) 
    .where('categories.user_id = ? AND comments.user_id = ?', @current_user.id, @current_user.id) 
+0

'where'メソッドは'/'を参照し、' 'comments'ではなく' 'categories''で動作します。 'categories'と' comments'の両方に 'user_id'属性/カラムがあります。 – Backo

+0

したがって、カテゴリとコメントの両方にwhere句が必要ですか?どういう意味ですか?あなたの質問は、 'user_id == @ current_user.id'を持たないコメントがあるという事実のようです。私の答えはそれを修正する。 – Mischa

+0

私はすべての 'categories.where(:user_id => @ current_user.id)'を取得したいと思っていて、すべての 'article.comments.where(:category_id => category_ids、:user_id => @ current_user.id) ) '。 'category_ids'は前述の' categories.where(:user_id => @ current_user.id) 'の配列です。 * P.S. *:私は明確かどうか分かりません。 – Backo

関連する問題