了解 ActiveRecord 中 where 的查询方法

Understanding query method where in ActiveRecord

我想 return 具有布尔值 show 的用户数,而不是设置为 true。 show 是一个布尔值,但被初始化为 nil.

正因为如此,我得到了一些我没有预料到的结果。例如,

[{show: nil}].where.not(show: true).count -> 0
[{show: nil}].where(show: [nil, false]).count -> 1

这个查询的 return 不应该是同一件事吗?

这是对NULL的普遍误解(顺便说一句,这并不少见)。

NULL没有可比性,既不真也不假,不等于不等于,不小于不大于等等,NULL甚至不能和[=10比较=].例如NULL = NULL 是错误的,但 NULL != NULL 也是错误的。

您的第一个案例 (.where.not(show: true)) 是 show != true(或 NOT(show =true)),相当于 show = false.

您的第二个示例 (.where(show: [nil, false])) 是 show IS NULL OR show = false。虽然此语法 show: [x,y] 通常会导致 IN() 子句 Arel 足够聪明,可以意识到这些值之一是 nil 并相应地转换 SQL 代,因为show IN (NULL,false) 等同于 show = NULL OR show = false(这就是 IN() 的工作方式),但如前所述,NULL = NULL 是错误的,因此存在 IS NULLIS NOT NULL

您的查询结果是因为没有行 show = false 但有一行 show IS NULL。