119

Rails 3.2 を使用していますが、このコードの何が問題になっていますか?

@reviews = @user.reviews.includes(:user, :reviewable)
.where('reviewable_type = ? AND reviewable.shop_type = ?', 'Shop', 'cafe')

次のエラーが発生します。

ポリモーフィック アソシエーション :reviewable を積極的にロードできません

reviewable.shop_type = ?条件を削除すると、機能します。

reviewable_typeand reviewable.shop_type(実際には)に基づいてフィルター処理するにはどうすればよいshop.shop_typeですか?

4

6 に答える 6

0

補足として、上部の回答は優れて:includeいます。何らかの理由で使用しているクエリにモデルのテーブルが含まれておらず、未定義のテーブルエラーが発生している場合は、関連付けで指定することもできます。

そのようです:

belongs_to :shop, 
           foreign_key: 'reviewable_id', 
           conditions: "reviews.reviewable_type = 'Shop'",
           include: :reviews

このオプションを指定せずに上記の例:includeの関連付けにアクセスしただけreview.shopでは、UndefinedTable エラーが発生します (Rails 4 ではなく Rails 3 でテスト済み) SELECT FROM shops WHERE shop.id = 1 AND ( reviews.review_type = 'Shop' )

この:includeオプションは代わりに JOIN を強制します。:)

于 2014-10-20T20:50:37.110 に答える
-1
@reviews = @user.reviews.includes(:user, :reviewable)
.where('reviewable_type = ? AND reviewable.shop_type = ?', 'Shop', 'cafe').references(:reviewable)

WHERE で SQL フラグメントを使用している場合、関連付けに参加するには参照が必要です。

于 2015-08-02T13:20:41.023 に答える