web-dev-qa-db-ja.com

activerecordの検索条件-nullまたはfalseを探しています

アクティブレコードで検索を行うとき、アーカイブビットがtrueに設定されていないレコードを探しています。

アーカイブされたビットの一部はnull(アーカイブされていない)であり、他のビットはアーカイブがfalseに設定されています。

明らかに、

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

null値のアーカイブビットを持つプロジェクトを見逃します。アーカイブされていないすべてのプロジェクトをアクティブレコードで選択するにはどうすればよいですか?

26
Daniel

これを試してください(in Rails 2):

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

これは、ここで説明されているように、古いバージョンのRailsの制限です。 https://Rails.lighthouseapp.com/projects/8994/tickets/1181-ar-find-produce-null-when-it-should- be-is-null

17
Ron DeVera

Rails 4(おそらく以前)は以下をサポートします:

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

...これは非常に簡潔です。

87
TJChambers

これを行うための適切なデータベースにとらわれない方法は次のとおりです。

Project.where("archived IS NULL OR archived = ?", false)
7
sean_j_roberts

@metasoarous

試してください:

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

データベースにとらわれないようにしたい場合は、Rails 3:

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