어쩌면 나는 미쳐 버리거나 휴식을 취해야 할 것입니다. 그러나 내 레일 콘솔에서 Order.where(state: nil).count
은 1010
을 반환하지만 은 0
을 반환합니다 ... 주문 상태가 nil이면 "대기 중"이 아니므로 세트는 not(state: "pending")
에 의해 where(state: nil)
세트를 포함하도록 반환됩니다.은`where.not (field : "something")`include`where (field : nil)`이 아니어야합니다.
이런 식으로 작동하지 않습니까? 그렇지 않다면 다른 방식으로 작동합니까?
편집 : 더 많은 정보! 어떤 레코드가 nil이 아닌 다른 데이터베이스에 가서 실행할 때 Order.where.not(state: "pending").count
나는 여러개의 명령을 되돌려 놓았습니다. 아무 것도 "보류 중"이고 아무 것도 nil이 아닙니다. 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 개 기록을 얻을, 나는 그 상태 전무 모든 기록을 얻을. 나는 단지 내가 왜
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"
데이터베이스에'NULL' /' 'pending'' 값만 있습니까? 'Order.pluck (: state)' –
불행히도 나는 레일스 환경에 접근 할 수 없기 때문에 스스로 테스트 할 수는 없지만'Order.where.not (status : "보류 중"). to_sql' 및 Order.where (상태 : nil) –
너무 영리합니다! – Ziggy