アクティブレコードで検索を行うとき、アーカイブビットがtrueに設定されていないレコードを探しています。
アーカイブされたビットの一部はnull(アーカイブされていない)であり、他のビットはアーカイブがfalseに設定されています。
明らかに、
Project.all(:conditions => {:archived => false})
null値のアーカイブビットを持つプロジェクトを見逃します。アーカイブされていないすべてのプロジェクトをアクティブレコードで選択するにはどうすればよいですか?
これを試してください(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
Rails 4(おそらく以前)は以下をサポートします:
Project.where(archived: [false, nil])
...これは非常に簡潔です。
これを行うための適切なデータベースにとらわれない方法は次のとおりです。
Project.where("archived IS NULL OR archived = ?", false)
@metasoarous
試してください:
Project.all(:conditions => "archived IS NULL OR archived = 'F'")
データベースにとらわれないようにしたい場合は、Rails 3:
Project.where("archived IS NULL OR archived = #{ActiveRecord::Base.connection.quoted_false}")