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
我想查询加入 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