2012-04-30 39 views
19

我有一個用戶模型,並且用戶有一個has_many寵物的關係。我想能夠寫一個ActiveRecord查詢,我可以選擇所有用戶沒有pet.name的「蓬鬆」的寵物Ruby on Rails使用連接的ActiveRecord查詢

什麼是最有效的方式來寫這個使用ActiveRecord?使用直接的SQL情況就會如下列:

select id from users INNER JOIN pets ON u.id = pets.user_id WHERE pets.name != "fluffy"

回答

37

這應該工作:

User.joins(:pets).where("pets.name != 'fluffy'") 

你也可能要在官方RoR的指導請following part(上joins)。

+2

請糾正我,如果我錯了,但它不會是「User.joins(:PET)......」 - 奇 - 爲符號參數? – jeffdill2

+2

@ jeffdill2這取決於關聯是如何定義的。例如,如果用戶'has_one:pet',你會是對的。 –

+0

@MikeC啊,對。 – jeffdill2

14

不存在SQL注入漏洞最乾淨的方法是使用查詢參數:

User.joins(:pets).where("pets.name != ?", "fluffy") 

有些數據庫驅動程序將利用上述準備好的發言重用數據庫查詢計劃。在這種情況下,只有參數值變化時,數據庫不必再次分析查詢。

24

在軌道4可以讓這個更清楚:

User.joins(:pets).where.not(pets: { name: 'fluffy' })