2016-07-18 85 views
2

我已經做了谷歌搜索,發現類似的問題,我的問題here,但是,我仍然失去了什麼解決方案應該是。我的情況如下:Rails 4:model.where.not不返回零記錄

我有一個名爲Book的數據庫表,它有category_id(表Category的外鍵)和author(varchar 255)。我需要通過category_id查詢此表,但不包括某個作者的姓名。例如:由作者李四得到所有CATEGORY_ID = 10的書籍,但不包括書籍:

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

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

這兩個查詢工作對我來說,除了對那些記錄的作者是nil。我還需要讓這些查詢返回具有nil作者的記錄。

+0

你嘗試過嗎? books = Book.where(category_id:10).where(「author <>?OR author =?」,「John Doe」,nil) – power

+0

'NULL'是未知的,因此您需要對其進行具體說明,克里斯曼德森的答案。 –

回答

8

您與最後一個查詢處於正確的軌道上。

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

這應該做你在問什麼。

側面說明,在導軌5,你可以使用orActiveRecord查詢,所以你可以這樣類似:

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

雖然我要說,在這種情況下,第一個查詢更清晰。

+0

對於Rails 4中的更多面向對象的方法,您也可以使用[this gem](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