ruby-on-rails-4 - 不应该是 `where.not(field: "的东西” )` include ` where(field : nil)`?

标签 ruby-on-rails-4 arel

也许我快疯了,或者只是需要休息一下,但是在我的 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 不是“待处理”的记录。当你设置 pendingnil (如 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/

相关文章:

ruby-on-rails - 将参数传递给局部 View - Rails 4/postgresql/json

python - Ubuntu 中的 PDF 到 PPT 转换器

ruby-on-rails - Rails 使用哈希数组查找记录

ruby-on-rails - 将 postgres hstore sql 转换为 Arel

javascript - AMP-HTML页面如何从rails/app/assets/javascript文件夹加载javascript?

ruby-on-rails - 模板文件未在 Rails 4 中呈现 form_for 的结果

ruby-on-rails - 有什么方法可以使用 AREL 进行自定义关联吗?

ruby-on-rails - rails 4 : Rack SSL enforcer ERR_SSL_PROTOCOL_ERROR with localhost

ruby-on-rails - 在 ActiveRecord 中获取 Union 所有结果