ActiveRecord Rails:使用关系中的条件获取记录

时间:2014-01-14 11:11:40

标签: ruby-on-rails activerecord

以下是一个示例:用户有许多汽车,而汽车属于用户。< / p>

我想提取所有汽车信息,但不是某些用户的汽车(这是因为我想删除我和一些同事来创建正确的统计数据)。

我试过了,但没有成功:

Car.where("car.user.name != 'john'")

有什么想法吗?您是否有关于获取关系条件的记录的一般规则?

感谢。

3 个答案:

答案 0 :(得分:2)

尝试以下内容:

Car.where('user_id != ?', User.find_by_<name?>('john').id

如果你有铁轨4:

Car.where.not(user_id: User.find_by(name: 'john')).id

更新:

上面的解决方案将起作用,因为您有一个可以查询的外键。更一般的解决方案是使用关联表执行左连接并过滤这些结果。无论关联类型如何,以下都将有效(包括has_many:through和has_and_belongs_to_many):

Car.includes(:user).where('users.name != ?', 'john')

# rails 4

Car.includes(:user).where.not(users: { name: 'john'})

答案 1 :(得分:0)

尝试

Car.joins([:user]).where("users.name != 'John'")

如果您需要所有汽车信息和user.name等用户信息,那么您可以

Car.joins([:user]).select('cars.*, users.name AS user_name').where("users.name != 'John'")

上面用单个sql查询做了事情

SELECT cars.*, users.name AS user_name FROM `cars` INNER JOIN `users` ON `users`.`id` = `cars`.`user_id` WHERE (users.name != 'John')

答案 2 :(得分:0)

Car.includes(:users).where("users.name NOT IN ('bill','peter','joe') OR cars.user_id IS NULL")

它将返回所有没有Bill,Peter或Joe用户名的汽车,以及不属于用户的汽车!