22

指定されたプロパティが空または空白ではないレコードを見つけようとしています。文字列であるため、データベースではnilではありません。

Post.where(:sourceurl != '')

上記は機能するはずですが、source_urlプロパティが空の場合でもレコードが返されます。これを行うための適切な方法は何ですか?

4

6 に答える 6

43

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 クエリよりも有利になるちょっとした魔法があります

于 2015-11-06T22:24:19.800 に答える
31

これを試して

Post.where("sourceurl <> ''")
于 2012-07-22T12:27:04.747 に答える
4

あなたのコードが機能しない理由は、あなたのパラメータ#where

:sourceurl != ''

(記号) は(空の文字列)と等しくないためtrue、これは に評価されます。したがって、コードは次と同じです:sourceurl''

Post.where(true)

abhas の回答を詳しく説明すると、MySQL と PostgreSQL の両方が!=and<>を同等のものとして受け入れます。

于 2012-07-22T14:12:51.633 に答える
3

postgresql では、空の文字列と nil の両方をキャッチするために次のことができます。

where("coalesce(sourceurl, '') != ''")
于 2015-06-11T11:12:55.450 に答える
3

データベースでそのフィールドがデフォルトで NULL である場合、それを解決するにはプレーンな SQL を使用する方がよいと思います。

Post.where("sourceurl is not null")
于 2012-07-22T12:20:34.817 に答える