を修正するには、私は三つのモデルを持っています。Railsの - - イーガーロード2つのテーブルが、1をフィルタリングするN + 1
ユーザーに属するすべての送信先を示す表を作成しています。ユーザーは、その宛先の一部(ただしすべてではない)のレビューを残しました。
コントローラー:
@user = User.find_by_id(params[:id])
@user_reviews = @user.destination_reviews
ビュー:
<% @user.destinations.each do |destination| %>
<% review = @user_reviews.find_by_destination_id(dest.id) %>
<% if review %>
<div class="review>
...show the review
</div>
<% else %>
<div class="add-review>
...prompt user to add a review
</div>
<% end %>
<% end %>
N + 1が@user_reviews.find_by_destination_id(dest.id)
で起こっている、@user_reviewsは、ユーザのレビューのプリロードリストです。
ユーザーがこれらの宛先に残したレビューを含め、このユーザーに属するすべての送信先を読み込むにはどうすればよいですか?
私のようないくつかのクエリを探しています:
dest_ids = current_user.destinations.pluck(:id)`
Destination.includes(:destination_reviews).where(id: dest_ids).where('destination_reviews.user_id = ?', user_id)
しかし、それはエラーがスローされます:私はそれをせずに@user_reviews.find_by_destination_id(dest.id)
を書くことができやり方があった場合、 ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "destination_reviews"
また再照会データベース、それは動作します。
ことが明らかであるか、私は詳細に
はあなたの先生ありがとうございました!だから 'group_by(&:destination_id)'は宛先IDをキーとしてハッシュを作成しますか? – CHawk
正確です。基本的に 'find_by_destination_id'を使ってデータベースに何度も戻ってくるのではなく、それらをすべて前にロードしてから、ハッシュから正しいものを取得します。 –