2

对于基本条件(如 find 语句)和更通用的 where 子句,用户可以查找任何一组条件。例如:

User.find_by_name(["One", "Two", "Three"])
User.find_by_name_and_age(["One", "Two"],[1,2,3])

或者

User.where(:bonus_id => [1,2,3])

但是,它们在这里略有不一致。如果你使用

User.find_by_bonus_id([nil,1,2])

正如预期的那样,这将返回奖励 id 为“nil”的使用!但是,“find_by_... and ...”格式和“where”格式都不能以这种方式工作。

User.where(:bonus_id => [nil,1])

将仅返回 Bonus_id 为 1 的用户。

User.where(:bonus_id => [nil]

将一无所有!

User.where(:bonus_id => nil)

但是,工作正常。

据我所知,where 子句(和 find_by_and 方法)会折叠它们的数组,删除任何不真实的值。这对我来说是一个非常重要的问题。

有谁知道将 nils 包含在 where 子句数组(或解决方法)中的方法,还是我最终必须将多个查询连接在一起才能获得正确的行为?

附加说明:
- 版本 3.0.11
- Nils 实际上并没有被删除,而是在某些情况下它比较的是 IN (NULL) 而不是 SQL 中的 IS NULL。我将保持原样,因为即使它不准确,它也是问题在遇到时首先出现的方式。

4

1 回答 1

2

我无法在 Rails 3.1.0 上重现您的问题。你用的是什么版本?

试试这个:

User.where(["bonus_id IN (?) OR bonus_id IS NULL", [1,2]])

将返回 bonus_id 为 1、2 或 null 的用户

于 2012-09-18T20:46:51.267 回答