2016-06-08 143 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")