[解決済み] イーガー・ロード・ポリモーフィック
2022-08-23 06:38:40
質問
Rails 3.2を使っていますが、このコードのどこが問題なのでしょうか?
@reviews = @user.reviews.includes(:user, :reviewable)
.where('reviewable_type = ? AND reviewable.shop_type = ?', 'Shop', 'cafe')
このようなエラーが発生します。
多相アソシエーション:reviewableをeagerlyにロードすることができません。
を削除すると
reviewable.shop_type = ?
の条件を削除すると、動作します。
どのようにすれば
reviewable_type
と
reviewable.shop_type
(これは実際には
shop.shop_type
)?
どのように解決するのですか?
推測するに、あなたのモデルは次のようなものでしょう。
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 は追加情報がない場合、結合を構築できません。
- reviewable という名前のテーブルはありません。
この問題を解決するためには、明示的に
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
すると、このようにクエリできます。
Review.includes(:shop).where(shops: {shop_type: 'cafe'})
テーブル名が
shops
であり
reviewable
. データベースにはreviewableというテーブルは存在しないはずです。
を明示的に定義するよりも、この方が簡単で柔軟性があると思います。
join
の間に
Review
と
Shop
を使うことで、関連するフィールドによるクエリに加えて、イーガー・ロードが可能になるからです。
これが必要な理由は、ActiveRecordではレビュー可能なものだけに基づいて結合を構築できないからです。なぜなら、複数のテーブルが結合の相手側を表すからです。 余分なリレーションシップを定義することで
belongs_to :shop
を定義することで、ActiveRecordに結合を完了するために必要な情報を与えていることになります。
関連
-
[解決済み】OS X Yosemite 10.10.5 で [Ruby on Rails] 5 をインストールすると extconf が失敗して終了コード 1 エラーになる。
-
[解決済み] rake db:migrateを使って1ステップだけロールバックする方法
-
[解決済み] heroku push rejected, failed to compile Ruby/rails app
-
[解決済み] Railsでpng画像を文字列形式で表示するには?
-
[解決済み] Railsで `before_action` での `only:` はどのように機能するのですか?
-
[解決済み] RoRにおけるSpringサーバーの機能とは?
-
[解決済み] "render :nothing => true" は空のプレーンテキストファイルを返すのですか?
-
[解決済み] RubyとRailsの "Date.today "フォーマット
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み】ActiveRecord::ReadOnlyRecordのエラーの原因は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み] Rubyのクラスで未初期化の定数エラーが発生する
-
[解決済み] rspecにおけるassignsの意味
-
[解決済み] バリデーションなしで属性を更新する方法
-
[解決済み] ルビーオンレール モデルから明確な値を選択する
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] レイル 4 radio_button_tag default not selected
-
[解決済み] Railsでグループとカウント
-
[解決済み] Rails 4で、以前のバージョンのRailsでattr_accessibleを使用していた状況に遭遇した場合、Forbidden Attributes Errorが発生する。