也许我快疯了,或者只是需要休息一下,但是在我的 Rails 控制台中 Order.where(state: nil).count
返回 1010
,但是 Order.where.not(state: "pending").count
返回 0
...如果订单的状态为 nil,则它不是“待处理”,所以我希望由 not(state: "pending")
返回的集合包括集合 where(state: nil)
.
不以这种方式工作吗?如果没有,arel 是否以不同的方式工作?
编辑:更多信息!当我转到另一个数据库时,其中一些记录的状态不是 nil,我运行 Order.where.not(state: "pending").count
我收到一堆订单,其中没有一个是“待处理”,但也没有一个是零。看来where.not
正在隐式添加 and not nil
到查询?
编辑:在绝望中,我转向了更黑暗的灵魂。
# look into another shop, that has records
o = Order.where(shop_id: 2)
# summon dread spirits
t = Order.arel_table[:state]
o.where(t.eq(nil).or(t.eq("pending").not)).count
=> 1569
o.where(t.eq(nil)).count
=> 1471
所以在这种情况下,我得到 98 条状态既不是 nil 也不是“pending”的记录,并且我得到了状态为 nil 的所有记录。我真的很想知道为什么我不能只说
where.not("pending")
并具有相同的效果。如果有我可以调用的选项?喜欢,where.not("pending", include_nil: true)
?编辑:根据@Filip Bartuzi 在评论中的要求
Order.where.not(state: "pending").to_sql
=> "SELECT \"orders\".* FROM \"orders\" WHERE \"orders\".\"shop_id\" = 2 AND (\"orders\".\"state\" != 'pending')"
Orders.where(state: nil).to_sql
=> "SELECT \"orders\".* FROM \"orders\" WHERE \"orders\".\"shop_id\" = 2 AND \"orders\".\"state\" IS NULL"
最佳答案
Order.where.not(state: "pending").to_sql
产生:=> "SELECT \"orders\".* FROM \"orders\" WHERE \"orders\".\"shop_id\" = 2 AND (\"orders\".\"state\" != 'pending')"
它将返回所有带有 VALUES 不是“待处理”的记录。当你设置 pending
至 nil
(如 Order.first.update! state: nil
它在数据库中分配 NULL
。NULL
不会被解释为 SQL 中的值,因此它不会包含在 SELECT
中回复
所以答案是:where.not(field: “something”)
不包括 where(field: nil)
!
您可以在此处查看它的工作原理:
http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
转到类别表并首先执行
UPDATE Categories
SET CategoryName = NULL
WHERE CategoryName = 'Beverages'
所以现在我们有 Count 8 的类别,其中之一有
NULL
在专栏CategoryName
现在执行:
SELECT CategoryName FROM Categories
WHERE CategoryName != 'Condiments'
如您所见,返回了 6 条记录(因此它跳过了一条
NULL
)
关于ruby-on-rails-4 - 不应该是 `where.not(field: "的东西” )` include ` where(field : nil)`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26371000/