Rails Nested Joins Activerecord с условиями

Я пытаюсь написать запрос вложенных объединений с условием.

Теперь у меня есть запрос:

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
'

Это говорит мне, что нет column 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

Ответ 1

Похоже, вам не нужны вложенные соединения здесь. Попробуйте использовать что-то вроде

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

Вложенное соединение также должно работать с помощью stores

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

Ответ 2

Самый простой способ - использовать фигурные скобки:

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

Ответ 3

Вы должны иметь доступ к retailers id со следующим синтаксисом:

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

пс. проверено на Rails 5