检查关联是否存在

Lon*_*don 2 ruby-on-rails ruby-on-rails-3

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

has_one :car
Run Code Online (Sandbox Code Playgroud)

和汽车型号:

belongs_to :user
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ity 5

您可以编写这样的查询:

User.includes(:car).where(cars: {user_id: nil})
Run Code Online (Sandbox Code Playgroud)

我建议将它提取到一个范围内:

class User < ActiveRecord::Base
  # ...

  def self.without_car
    includes(:car).where(cars: {user_id: nil})
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地写

User.without_car
Run Code Online (Sandbox Code Playgroud)

编辑

澄清一下:在幕后,将发出此查询:

SELECT "users"."name" FROM "users"
LEFT OUTER JOIN "cars" ON "cars"."user_id" = "users"."id"
WHERE "cars"."user_id" IS NULL
Run Code Online (Sandbox Code Playgroud)

连接将导致 的空行car.user_id,因此我们可以简单地检查该行是否是NULL(或者,从 Active Record 的角度来看,nil)。

顺便说一句,这也适用于has_many关系,只需将参数更改includes为复数即可。请注意,参数 towhere始终需要是复数形式,因为它是表名。

  • @ManojMonga 请在拒绝投票并声称我的答案错误之前验证您是否正确。我已经检查过并且有效。请参阅我的编辑,它包括查询。连接将导致 `car.user_id` 为空行,因此我们可以简单地检查它是否为 `NULL`。 (3认同)