Ruby on rails Rails 4:model.where.not不返回nil记录

Ruby on rails Rails 4:model.where.not不返回nil记录,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我在谷歌上搜索了一下,发现了与我的问题类似的问题,但我仍然不知道该怎么解决。我的情况如下: 我有一个名为Book的数据库表,其中有category\u id(表category的外键)和author(varchar 255)。我需要通过category\u id查询此表,但不包括某些作者的姓名。示例:获取类别_id=10的所有书籍,但不包括作者John Doe的书籍: books = Book.where(category_id: 10).where.not(author: 'John Doe'

我在谷歌上搜索了一下,发现了与我的问题类似的问题,但我仍然不知道该怎么解决。我的情况如下:

我有一个名为
Book
的数据库表,其中有
category\u id
(表
category
的外键)和
author
(varchar 255)。我需要通过
category\u id
查询此表,但不包括某些作者的姓名。示例:获取类别_id=10的所有书籍,但不包括作者John Doe的书籍:

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


除了作者是
nil
的记录外,这两个查询对我有效。我还需要让这些查询返回
nil
author的记录

您上次的查询是正确的

Book.where(category_id: 10).where("author != ? OR author IS NULL", "John Doe")
这应该符合你的要求

旁注,在Rails 5中,您可以将
ActiveRecord
查询一起使用,因此您可以这样做:

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

尽管我认为,在这种情况下,第一个问题更清楚。

您尝试过这个吗?books=Book.where(category_id:10)。where(“author?OR author=?”,“John Doe”,nil)
NULL
是未知的,因此您需要根据@chrismanderson的答案对其进行详细说明。对于Rails 4中更面向对象的方法,您也可以使用。请参阅以获取灵感。这里的原因是
'x'=NULL
为假,但
'x'=NULL
也是false。基本上,
NULL
不等于或不等于其他值,包括其本身,因此需要
is NULL
Book.where(category_id: 10).where.not(author: 'John Doe').or(where(author: nil))