我有一个像这样的用户模型:
has_one :car
和汽车模型:
belongs_to :user
如何查看哪些用户没有车?
答案 0 :(得分:4)
您可以编写如下查询:
User.includes(:car).where(cars: {user_id: nil})
我建议将其提取到范围内:
class User < ActiveRecord::Base
# ...
def self.without_car
includes(:car).where(cars: {user_id: nil})
end
end
然后你可以简单地写
User.without_car
修改强>
澄清:在幕后,将发出此查询:
SELECT "users"."name" FROM "users"
LEFT OUTER JOIN "cars" ON "cars"."user_id" = "users"."id"
WHERE "cars"."user_id" IS NULL
联接将导致car.user_id
的空行,因此我们只需检查该行是否为NULL
(或者,从Active Record的角度来看,nil
)。
顺便说一下,这也适用于has_many
关系,只需将参数更改为includes
为复数。请注意,where
的参数总是需要复数,因为它是表名。