2016-06-08 3 views
0

지불 상태 문자열 필드가있는 주문 모델이 있습니다. 일반적으로이 필드는 채워 져야하지만 때로는 nil입니다. 다음 범위가 있습니다where.not with Rails를 사용할 때 혼란스러운 결과

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

내 테스트 중 하나에서 payment_status는 주문에 대해 nil이지만 범위에 대해 여전히 빈 결과를 얻습니다. 내가 .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을 포함하도록 변경 where("payment_status <> 'pending' OR payment_status IS NULL")

UPDATE에 해당 모두

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

을 확인합니다, 함께 nil를 추가

+0

는이 코드를 시도했다가 테스트 데이터베이스에 실행 : 귀하의 경우 그래서

, 나는 아마 작성합니다 왜냐하면 레일즈는 NULL을 찾는 동안 레일이 저장되지 않기 때문이다. 나는 확실하지 않다. – Bijendra

+0

현재 결과가 아닌 nil 값으로 결과를 표시하고 싶다. 귀하의 제안은 분명히 nil 값을 배제 할 것입니다. 미안, 내 질문에 분명하지 않은 경우. – Simmo

+0

@Simmo가 업데이트되었으므로 다시 시도하십시오 – lusketeer

1

이것은 Rails가 아니라 SQL이 실제로 작동하기 때문에 발생합니다.
!=은 다른 의미이지만 여전히 의미가 있습니다. NULL은 뭔가가 아닙니다.

this related issue을 볼 수 있습니다.

1

SQL에서 식의 NULL 값은 항상 식을 false로 평가합니다. 이론은 0으로 평가할 수있는 빈 값뿐만 아니라 NULL 값도 알 수 없으며 NULL 값도 알 수 없다는 것입니다.

예를 들어 1 = NULL은 false이지만 1 != NULL도 false입니다. 나는 당겨 할 수 없을 것이다 느낌

where("payment_status != 'pending' or payment_status is null") 
관련 문제