Ruby on rails HABTM关联的查询条件不工作

Ruby on rails HABTM关联的查询条件不工作,ruby-on-rails,join,activerecord,has-and-belongs-to-many,Ruby On Rails,Join,Activerecord,Has And Belongs To Many,我想查询HABTM关联中的两种型号、设备和用户: @device = Device.left_outer_joins(:users).where(users: {id: nil || 4}) 我正在尝试获取联接表中nil或id为4的任何用户。问题在于,此查询忽略了nil条件并生成以下内容: SELECT `devices`.* FROM `devices` LEFT OUTER JOIN `devices_users` ON `devices_users`.`device_id` = `dev

我想查询HABTM关联中的两种型号、设备和用户:

@device = Device.left_outer_joins(:users).where(users: {id: nil || 4})
我正在尝试获取联接表中
nil
或id为
4
的任何用户。问题在于,此查询忽略了
nil
条件并生成以下内容:

SELECT `devices`.* FROM `devices` LEFT OUTER JOIN `devices_users` ON `devices_users`.`device_id` = `devices`.`id` LEFT OUTER JOIN `users` ON `users`.`id` = `devices_users`.`user_id` WHERE `devices`.`serial` = '1111-1111-10' AND `users`.`id` = 4

如何使该条件有效?

nil | | 4
的计算结果为
4
,因此查询忽略nil

如果您稍微更改一下查询,它就会工作。试试这个:

@device = Device.left_outer_joins(:users).where(users: {id: [nil, 4]})
ActiveRecord将获取
[nil,4]
数组,并将其转换为您要查找的查询。例如,查询的SQL如下所示:

SELECT `devices`.* FROM `devices` LEFT OUTER JOIN `devices_users` ON `devices_users`.`device_id` = `devices`.`id` LEFT OUTER JOIN `users` ON `users`.`id` = `devices_users`.`user_id` WHERE `devices`.`serial` = '1111-1111-10' AND `users`.`id` = 4 OR `users`.`id` IS NULL
另外,这是ActiveRecord的一个非常简洁的部分。您甚至可以为它提供一个包含更多ID的数组,如下所示
[nil,4,5]
,这将为您提供类似SQL的:

SELECT `devices`.* FROM `devices` LEFT OUTER JOIN `devices_users` ON `devices_users`.`device_id` = `devices`.`id` LEFT OUTER JOIN `users` ON `users`.`id` = `devices_users`.`user_id` WHERE `devices`.`serial` = '1111-1111-10' AND `users`.`id` IN (4, 5) OR `users`.`id` IS NULL