Rails嵌套连接条件的Activerecord

sty*_*own 20 sql ruby-on-rails rails-activerecord

我正在尝试用条件编写嵌套连接查询.

我现在的查询是:

Event.joins(:store => :retailer).where(store: {retailer: {id: 2}})
Run Code Online (Sandbox Code Playgroud)

哪个输出以下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
'
Run Code Online (Sandbox Code Playgroud)

还有以下错误:

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
'
Run Code Online (Sandbox Code Playgroud)

它告诉我没有列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
Run Code Online (Sandbox Code Playgroud)

dim*_*uch 28

看起来你不需要嵌套连接.尝试使用类似的东西

Event.joins(:store).where(stores: {retailer_id: 2})
Run Code Online (Sandbox Code Playgroud)

嵌套连接也应该可以使用 stores

Event.joins(:store => :retailer).where(stores: {retailer: {id: 2}})
Run Code Online (Sandbox Code Playgroud)

  • 真棒,我需要使用"商店"而不是"商店"....这样一个简单的解决方案.谢谢dimuch! (3认同)

小智 6

有一个最简单的方法来代替使用大括号:

Event.joins(:store => :retailer).where('stores.retailer_id => ?', 2)
Run Code Online (Sandbox Code Playgroud)