2

:액티브 :하지만 .where.not (foo는 "바") : 성공적으로 이야기 해봐 ("바"foo는)으로 조회 할 수 올바른 결과를 반환하지 않습니다 나는 쿼리과 같이 구축

@events = current_organization.events.order(started_at: :asc) 

status"canceled"이 아닌 모든 이벤트를 쿼리하고 싶습니다. 그러나 다음과 같은 쿼리를 사용할 때 :

current_organization.events.order(started_at: :asc).where.not(status: "canceled") 

아무 것도 반환하지 않습니다. 그러나, 단지 실험과를 위해 나는 노력 :

@events = current_organization.events.where(status: "canceled") 

그것은 성공적으로 취소 된 이벤트를 반환했습니다. 어떤 이유로 인버스가 작동하지 않습니다. 그 이유가 무엇입니까?

편집 : 찾을 수있는 유일한 주위의 where(status: nil) 사용하고 있지만 정말 직관적이지 않습니다.

+1

#to_sql 출력을 확인하십시오. 이것은 SQL 문을 디버깅하는데 유용합니다 current_organization.events.order (started_at : : asc) .where.not (상태 : "취소") to_sql –

+0

이벤트 모델에'default_scope'가 설정되어 있습니까? 어디에요 (상태 "취소") – mysmallidea

+0

@MickeySheu 여기서, 다른 출력 '@Events = current_organization.events.order (: ASC started_at)이다. to_sql' '=> 이벤트 \ "선택"\ " * "events_"= "조직 _id"= 1 AND \ "이벤트 \"상태 \ "="취소 "\"이벤트 \ "순서 \"시작 \ "이벤트 \ "ASC"' '@Events = current_organization.events.order (started_at : ASC) .where.not (상태 : "취소"). to_sql' '=> "SELECT \"이벤트 \ "* FROM. \ "events \"\ "events \"\ "events \"= \ "events \"started_at \ "events \"\ "events \ "ASC" – Antonio

답변

2

질문에이 업데이트 :

편집 : 내 유일한 작업 주위에 난 그냥 where(status: nil)을 사용하고 찾을 수 있지만 정말 직관적입니다.

이 중요합니다. 그러면 status 열에 NULL 값이 허용되고 NULL 값이 있다는 것을 알 수 있습니다.

NULL과 ActiveRecord의 다소 불량한 구현 인 where.not을 함께 사용하면 문제가 발생합니다. 우리는 SQL을 보면 의해 생산되는 :

where.not(status: "canceled") 

우리는 다음을 참조하십시오

("events"."status" != 'canceled') 

그러나 SQL에서

는 모두 x = nullx <> null 모두 x 자체가 null 경우를 포함하여 모든 x (대한 null로 평가)이고 null은 SQL에서 true 값이 아닙니다. 즉 null이 포함될 때 x <> y이 정확히 x = y의 반대가 아닙니다. 행 statusnull 인 경우 where status = 'canceled'도 아니고 where status != 'canceled'도 찾을 수 없습니다. 당신의 status 열에서 null의 허용

나에게 이상한 소리 ... is null, is not null, is distinct from, is not distinct from : null의이 관련 될 때마다

, 당신은 그들이 방법은 당신이 예상 null 치료 사업자와 함께 작동해야 문제를 만들 것 고정 멀리 이동합니다

  1. 가 함께 작동하도록 더 좋은 뭔가 모든 null 상태를 변경하는 마이그레이션을 추가합니다. status is null 열에는 행/모델에 상태가 전혀없고 이상하다는 사실이 표시되어 실제 상태 코드가 모두 제공됩니다.
  2. statusnot null으로 이전을 추가하면 null 상태에 대해 다시 걱정할 필요가 없습니다.
  3. 모델의 유효성을 업데이트하여 status.nil?이 발생하지 않도록하십시오. 당신이 null의 이해가 당신이 SQL에서 어떻게 null 작업을 처리 할 준비가있어 확신 아니라면 일반적으로

은 어디서든 널 (NULL) 컬럼을 사용하지 마십시오.

+0

내 열의 기본값을 열을 null이 아닌 것과 동일하게 설정합니까? – Antonio

+0

실제로는 아니지만 'not null'으로 설정하고 기본값을 추가 할 수 있습니다. 당신은 정말로 컬럼이'not null'이 되길 원한다. 그렇지 않으면'null's이 거기서 끝나고 문제를 일으킬 것이다. –

+0

귀하의 대답은 SQL이 null을 처리하는 방법을 설명하는 데 정말 도움이되었습니다. 나는 앞서 가서 그 칼럼에 필요한 변화를 주었고, 그것이 나에게 문제가 될 것이라고 생각하지 않는다. 고맙습니다. – Antonio