检查是否存在关联

时间:2014-01-10 12:58:10

标签: ruby-on-rails ruby-on-rails-3

我有一个像这样的用户模型:

has_one :car

和汽车模型:

belongs_to :user

如何查看哪些用户没有车?

1 个答案:

答案 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的参数总是需要复数,因为它是表名。