2009-09-26 70 views
22

当在活动记录中进行搜索时,我正在查找没有归档位设置为true的记录。activerecord搜索条件 - 寻找空或假

某些归档位为空(未归档)其他归档设置为false。

显然,

Project.all(:conditions => {:archived => false}) 

错过与空值归档位的项目。如何选择所有未归档项目的活动记录?

回答

16

试试这个(中梁2):

Project.all(:conditions => ['archived IS NULL OR archived = ?', false]) 

这是旧版本的Rails的限制,如下解释:https://rails.lighthouseapp.com/projects/8994/tickets/1181-ar-find-producing-null-when-it-should-be-is-null

+0

Ron - 我按照你的建议从SQLite收到以下错误消息。 SQLite3 :: SQLException:没有这样的列:FALSE:SELECT * FROM“review_phases”WHERE(关闭IS NULL或关闭= FALSE)LIMIT 20 OFFSET 0是否SQLite只是处理布尔值不同而不工作? – metasoarous 2010-03-25 20:32:32

0

@metasoarous

尝试:

Project.all(:conditions => "archived IS NULL OR archived = 'F'") 
0

如果你想成为数据库不可知论者,你可以在Rails 3:

Project.where("archived IS NULL OR archived = #{ActiveRecord::Base.connection.quoted_false}") 
+1

@ SeanLazer的答案在Rails 3.0.9中可用,看起来有点干净。 – John 2012-08-03 02:44:49

6

正确的数据库无关的方式来做到这一点是:

Project.where("archived IS NULL OR archived = ?", false) 
+0

谢谢!适用于SQLite和Postgres。如果您认为这不起作用,请仔细检查您的数据库**中的值是否为假,而不是空值。会救了我一些困惑。 – John 2012-08-03 02:43:59

74

轨道4(可能更早)支持:

Project.where(archived: [false, nil]) 

...这是相当简洁。

+1

作品中的Rails 3.2.14 – Trip 2014-04-20 12:19:25

+1

也发现了这个工作(有点题外话,但另一种方式来使用空: Project.where(存档:VALID_VALUES + [无]) 如... Project.where (linkage:account.project_codes.map(&:id)+ [nil]) – TJChambers 2014-05-08 22:51:34

+1

这应该是被接受的答案。 – 2015-10-09 19:29:44