私の推測では、あなたのモデルは次のように見えることである:
class User < ActiveRecord::Base
has_many :reviews
end
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, polymorphic: true
end
class Shop < ActiveRecord::Base
has_many :reviews, as: :reviewable
end
あなたはいくつかの理由でそのクエリを実行することはできません。
- ActiveRecordは、追加情報なしで結合を構築することができません。
- 何の表がありませんが、この問題を解決するために検討可能
と呼ばれ、明示的Review
とShop
との間の関係を定義する必要があります。
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, polymorphic: true
# For Rails < 4
belongs_to :shop, foreign_key: 'reviewable_id', conditions: "reviews.reviewable_type = 'Shop'"
# For Rails >= 4
belongs_to :shop, -> { where(reviews: {reviewable_type: 'Shop'}) }, foreign_key: 'reviewable_id'
# Ensure review.shop returns nil unless review.reviewable_type == "Shop"
def shop
return unless reviewable_type == "Shop"
super
end
end
次に、あなたは次のように問い合わせることができます:テーブル名がshops
ないreviewable
ある
Review.includes(:shop).where(shops: {shop_type: 'cafe'})
ていることに注意してください。データベースにreviewableというテーブルがあってはいけません。
Review
とShop
の間に明示的にjoin
を定義するより簡単で柔軟性があると思います。これは、関連するフィールドでのクエリに加えて熱心に負荷をかけることができるためです。
これが必要な理由は、複数のテーブルが結合のもう一方の端を表しているため、ActiveRecordがレビュー可能なだけで結合を構築できないことです.SQLは、わかっている限り、列に格納されている値で除算します。余分な関係belongs_to :shop
を定義することで、ActiveRecordは結合を完了するために必要な情報を提供します。
完璧な答えと詳細な説明。ありがとう。 – Victor
実際に私は何も宣言することなくこれを使い終えました: '@reviews = @ user.reviews.joins(" INNER JOINショップON(reviewable_type = 'ショップ' AND shops.id = reviewable_id AND stores.shop_type = '"+タイプ+ ":") ")。includes(:user、:reviewable =>:photos)' – Victor
これは機能しますか? –