2012-04-30 40 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' })