指定されたプロパティが空または空白ではないレコードを見つけようとしています。文字列であるため、データベースではnilではありません。
Post.where(:sourceurl != '')
上記は機能するはずですが、source_urlプロパティが空の場合でもレコードが返されます。これを行うための適切な方法は何ですか?
指定されたプロパティが空または空白ではないレコードを見つけようとしています。文字列であるため、データベースではnilではありません。
Post.where(:sourceurl != '')
上記は機能するはずですが、source_urlプロパティが空の場合でもレコードが返されます。これを行うための適切な方法は何ですか?
ActiveRecord (Rails 3 と 4 だと思います) では、配列を引数として渡すことで、複数の条件をチェックできます。nil
したがって、 と の両方をチェックしたい場合は''
、次を使用できます。
where(sourceurl: [nil, ''])
これにより、次のような SQL 条件が生成されます。
(sourceurl IS NULL OR sourceurl = '')
Rails 4 では、.not を使用して否定的な条件を確認できるため、元の質問については、次のようにすることができます。
Post.where.not(sourceurl: [nil, ''])
.not には、データベース全体で機能し、NOT NULL クエリを自動的に実行するため、純粋な SQL クエリよりも有利になるちょっとした魔法があります。
これを試して
Post.where("sourceurl <> ''")
あなたのコードが機能しない理由は、あなたのパラメータ#where
が
:sourceurl != ''
(記号) は(空の文字列)と等しくないためtrue
、これは に評価されます。したがって、コードは次と同じです:sourceurl
''
Post.where(true)
abhas の回答を詳しく説明すると、MySQL と PostgreSQL の両方が!=
and<>
を同等のものとして受け入れます。
postgresql では、空の文字列と nil の両方をキャッチするために次のことができます。
where("coalesce(sourceurl, '') != ''")
データベースでそのフィールドがデフォルトで NULL である場合、それを解決するにはプレーンな SQL を使用する方がよいと思います。
Post.where("sourceurl is not null")