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

ran*_*its 31 activerecord ruby-on-rails

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

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

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

Amo*_*tir 50

这应该工作:

User.joins(:pets).where("pets.name != 'fluffy'")
Run Code Online (Sandbox Code Playgroud)

您也可以阅读官方RoR指南中的以下部分(上joins).

  • 如果我错了请纠正我,但不会是'User.joins(:pet)......' - 奇异 - 对于符号参数? (2认同)
  • @ jeffdill2这取决于关联的定义方式.例如,如果用户`has_one:pet`,你就是对的. (2认同)

Alb*_*bin 39

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

User.joins(:pets).where.not(pets: { name: 'fluffy' })
Run Code Online (Sandbox Code Playgroud)


ger*_*tas 19

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

User.joins(:pets).where("pets.name != ?", "fluffy")
Run Code Online (Sandbox Code Playgroud)

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