2016-06-08 5 views
0

У меня есть модель заказов с полем строки состояния платежа. Обычно это поле должно быть заполнено, но иногда оно ноль. У меня есть следующий объемНеверный результат при использовании where.not with Rails

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

В одном из моих испытаний payment_status равна нулю для заказа, но я все еще получаю пустой результат для области. Если я изменю его, чтобы удалить .not, я снова получаю пустой результат, поэтому я немного смущен.

EDIT - Добавлена ​​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") 
Смежные вопросы