47

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

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

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

4

3 回答 3

66

这应该有效:

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

此外,您可能还想阅读官方 RoR 指南的以下部分(关于joins)。

于 2012-04-30T22:19:29.543 回答
59

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

User.joins(:pets).where.not(pets: { name: 'fluffy' })
于 2015-03-16T14:53:07.273 回答
24

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

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

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

于 2014-02-04T21:56:18.963 回答