2016-07-18 53 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