`where.not(field: "something")` 不应该包含 `where(field: nil)` 吗?

2024-01-17

也许我要疯了,或者只是需要休息一下,但在我的 Rails 控制台中Order.where(state: nil).count回报1010, but Order.where.not(state: "pending").count回报0...如果订单的状态为零,则它不是“待处理”,所以我期望返回的集合not(state: "pending")包括该集where(state: nil).

Arel 不可以这样工作吗?如果不是,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')"

它将返回所有具有非“待处理”值的记录。当你设置pending to nil (like 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 http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

进入categories表,首先执行

UPDATE Categories
SET CategoryName = NULL
WHERE CategoryName = 'Beverages'

现在我们有 Count 8 的类别,其中之一有NULL在列上CategoryName

现在执行:

SELECT CategoryName FROM Categories
WHERE CategoryName != 'Condiments'

如您所见,返回了 6 条记录(因此它跳过了一条NULL)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`where.not(field: "something")` 不应该包含 `where(field: nil)` 吗? 的相关文章

随机推荐