Ruby on Rails使用连接进行ActiveRecord查询

我有一个用户模型,用户有一个has_many宠物的关系。 我希望能够编写一个ActiveRecord查询,我可以选择所有用户没有pet.name“蓬松”的用户

使用ActiveRecord写这个的最有效方法是什么? 使用直接SQL它会看起来如下所示:

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

这应该工作:

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

您还可以阅读官方RoR指南中的以下部分 (关于joins )。

在rails 4中,您可以更清楚地说明这一点:

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

没有SQL注入漏洞的最简洁方法是使用查询参数:

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

一些数据库驱动程序将利用上面的预准备语句来重用数据库查询计划 在这种情况下,当只有param值变化时,数据库不必再次分析查询。