2009-09-26 71 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