2016-06-08 55 views
0

我有一个付款状态字符串字段的订单模型。通常这个领域应该填充,但有时它是零。我有以下范围使用where.not与Rails时混淆结果

scope :not_pending, -> { where.not(payment_status: 'pending') } 

在我的一个测试中,payment_status为零,但我仍然得到一个空的范围结果。如果我改变它来删除.not,我会再次得到一个空的结果,所以我有点困惑。

编辑 - 添加SQL

"SELECT "orders".* FROM "orders" INNER JOIN "order_compilations" ON "orders"."id" = "order_compilations"."order_id" WHERE "order_compilations"."menu_group_id" = 3724 AND ("orders"."payment_status" != 'pending')" 
+0

看到生成的SQL语句,并在您的测试数据库运行它们 – emaillenin

回答

1

只需添加nil一起,然后将同时检查

scope :not_pending, -> { where.not(payment_status: 'pending').or(payment_status: nil) } 

这相当于where("payment_status <> 'pending' OR payment_status IS NULL")

UPDATE 改为包括零

+0

你试过这个代码,我觉得这将不能够拉数据,因为轨道没有存储,而它会查找NULL。我不确定 – Bijendra

+0

我希望结果显示为零值,而目前没有。你的建议肯定会排除零值,这是我已经不幸的,尽管没有选择。对不起,如果我不清楚我的问题。 – Simmo

+0

@Simmo更新,再试 – lusketeer

1

这不是因为Rails,而是因为它是SQL实际工作的方式。
!=意味着不同的东西,但仍然是一些东西。 NULL不是什么东西。你可以看到this related issue

1

在SQL中,表达式中的NULL值将始终将表达式评估为false。理论是NULL值是未知的,不只是一个空值,你可以评估为0,或者是false。

因此,例如,1 = NULL是错误的,但1 != NULL也是错误的。

所以你的情况,我可能会写:

where("payment_status != 'pending' or payment_status is null")