以下是一个示例:用户有许多汽车,而汽车属于用户。< / p>
我想提取所有汽车信息,但不是某些用户的汽车(这是因为我想删除我和一些同事来创建正确的统计数据)。
我试过了,但没有成功:
Car.where("car.user.name != 'john'")
有什么想法吗?您是否有关于获取关系条件的记录的一般规则?
感谢。
答案 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用户名的汽车,以及不属于用户的汽车!