Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 检查关联是否存在_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

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