2016-07-18 3 views
2

Google 검색을 수행하고 내 질문 here과 비슷한 질문을 발견했습니다. 그러나 해결책이 무엇인지에 대해서는 여전히 분실했습니다. 내 경우는 다음입니다 :Rails 4 : model.where.not은 nil 레코드를 반환하지 않습니다.

가 나는 category_id (테이블 Category에 외래 키) 및 author (VARCHAR 255)가 위치를 데이터베이스 테이블이 Book라고합니다. category_id으로이 테이블을 쿼리해야하지만 특정 작성자 이름은 제외해야합니다. 예 : 저자 미상으로 모든 CATEGORY_ID = 10 도서는 제외 책을 얻을 :

books = Book.where(category_id: 10).where.not(author: 'John Doe') 

또는

이 두 쿼리는 누구의 저자 nil 인 레코드를 제외하고 나를 위해 작동
books = Book.where(category_id: 10).where("author != ?", "John Doe") 

. 또한 이러한 쿼리는 nil 작성자가있는 레코드를 반환해야합니다.

+0

시도해 보셨습니까? books = where (category_id : 10) .where ("author <> 또는 author =?", "Doe doe", nil) – power

+0

NULL은 알 수 없으므로 특별히 @ 크리스 먼더슨의 대답. –

답변

8

마지막 검색어로 올바른 길을 걷고있었습니다.

Book.where(category_id: 10).where("author != ? OR author IS NULL", "John Doe") 

이것은 사용자가 요구하는대로해야합니다. 내가 주장하는 것 비록

Book.where(category_id: 10).where.not(author: 'John Doe').or(where(author: nil)) 

가,이 경우, 첫 번째 쿼리가 명확 : 당신이 그렇게 뭔가 같이 할 수 있도록

사이드 노트, 레일 오, 당신은, ActiveRecord 쿼리 or를 사용할 수 있습니다.

+0

레일 4에서 객체 지향적 인 접근법을 사용하려면 [이 보석] (https://github.com/oelmekki/activerecord_any_of)을 사용할 수도 있습니다. 영감을 얻으려면 [이 예] (https://github.com/oelmekki/activerecord_any_of#dynamic-or-queries)를 참조하십시오. –

+1

여기서''x '= NULL''은 거짓이지만''x'! = NULL''도 거짓입니다. 기본적으로'NULL'은 자신을 포함한 다른 값과 같지도 같지도 않으므로 'IS NULL'이 필요합니다. – tadman

관련 문제