HABTM 关联的查询条件不起作用

Query condition to HABTM association not working

我想查询加入 HABTM 关联中的两个模型,设备和用户:

@device = Device.left_outer_joins(:users).where(users: {id: nil || 4})

我正在尝试获取加入 table 中 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