Ruby on rails 检查关联是否存在
我有这样一个用户模型:Ruby on rails 检查关联是否存在,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有这样一个用户模型: has_one :car 车辆型号: belongs_to :user 如何检查哪些用户没有车?您可以编写如下查询: User.includes(:car).where(cars: {user_id: nil}) 我建议将其提取到一个范围中: class User < ActiveRecord::Base # ... def self.without_car includes(:car).where(cars: {user_id: nil})
has_one :car
车辆型号:
belongs_to :user
如何检查哪些用户没有车?您可以编写如下查询:
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
编辑
澄清:在幕后,将发布以下查询:
SELECT "users"."name" FROM "users"
LEFT OUTER JOIN "cars" ON "cars"."user_id" = "users"."id"
WHERE "cars"."user_id" IS NULL
联接将导致car.user\u id
的一个空行,因此我们可以简单地检查该行是否为NULL
(或者,从活动记录的角度来看,nil
)
顺便说一句,这也适用于
有许多关系的情况,只要将参数更改为包括也更改为复数即可。请注意,where
的参数始终需要是复数,因为它是表名。要在哪里检查它?在测试中,在验证中?你想实现什么?@SimoneCarletti他们应该进行验证,但仍有一些情况,我正在尝试找出损坏情况如果你想检查用户是否有车,那么@user.car.blank?
将在用户没有车的情况下返回true。或者,如果你想获得所有没有车的用户,那么User.where(id:car.pulk(:User_id).uniq)
@ManojMonga,User.where(id:car.pulk(:User_id).uniq)-一定要找到有车的用户,而不是没有车的用户。你弄错了。那真的叫示波器吗?@devanand我想这是一个历史上发展起来的名字,看看下面的投票人会不会这么好,解释一下这是怎么回事?我想改进我的答案。用户id会是零吗?我认为外键约束的第一个条件是列不能为空。如果有任何一辆车的用户id为零,这意味着这辆车不属于任何用户。@ManojMonga请验证您是否正确,然后再进行向下投票,并声称我的答案是错误的。我已经检查过了,可以用了。请参见我的编辑,它包括查询。联接将导致car.user\u id
的一个空行,因此我们可以简单地检查它是否为NULL
。
SELECT "users"."name" FROM "users"
LEFT OUTER JOIN "cars" ON "cars"."user_id" = "users"."id"
WHERE "cars"."user_id" IS NULL