web-dev-qa-db-ja.com

Rails Nested Joins Activerecord with conditions

条件付きのネストされた結合クエリを記述しようとしています。

私が今持っているクエリは:

Event.joins(:store => :retailer).where(store: {retailer: {id: 2}})

次のSQLを出力します。

   SELECT "events".* FROM "events" INNER JOIN "stores" ON "stores"."id" = "events"."store_id" INNER JOIN "retailers" ON "retailers"."id" = "stores"."retailer_id" WHERE "store"."retailer_id" = '---
:id: 2
'

また、次のエラー:

SQLite3::SQLException: no such column: store.retailer_id: SELECT "events".* FROM "events" INNER JOIN "stores" ON "stores"."id" = "events"."store_id" INNER JOIN "retailers" ON "retailers"."id" = "stores"."retailer_id" WHERE "store"."retailer_id" = '---
:id: 2
'

列store.retailer_idがないことがわかりますが、次のクエリを実行すると問題なく動作します。

Event.first.store.retailer_id
  Event Load (0.2ms)  SELECT  "events".* FROM "events"   ORDER BY "events"."id" ASC LIMIT 1
  Store Load (0.1ms)  SELECT  "stores".* FROM "stores"  WHERE "stores"."id" = ? LIMIT 1  [["id", 28958]]
=> 4
21
stytown

ここではネストされた結合は必要ないようです。次のようなものを使用してみてください

Event.joins(:store).where(stores: {retailer_id: 2})

ネストされた結合もstoresを使用して機能するはずです

Event.joins(:store => :retailer).where(stores: {retailer: {id: 2}})
29
dimuch

中括弧を使用する代わりに最も簡単な方法があります:

Event.joins(:store => :retailer).where('stores.retailer_id => ?', 2)
4
Rio Dermawan

次の構文でretailers idにアクセスできるはずです。

Event.joins(:store => :retailer).where('retailers.id' => 2)

ps。 Rails 5でテスト済み

1