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
文はイーガーローディング効果をキャンセルする理由を理解したいと思います。
'where'メソッドは'/'を参照し、' 'comments'ではなく' 'categories''で動作します。 'categories'と' comments'の両方に 'user_id'属性/カラムがあります。 – Backo
したがって、カテゴリとコメントの両方にwhere句が必要ですか?どういう意味ですか?あなたの質問は、 'user_id == @ current_user.id'を持たないコメントがあるという事実のようです。私の答えはそれを修正する。 – Mischa
私はすべての '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