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