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)
如何查看哪些用户没有汽车?
您可以编写这样的查询:
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始终需要是复数形式,因为它是表名。
| 归档时间: |
|
| 查看次数: |
3027 次 |
| 最近记录: |