ActiveRecordクエリで空の文字列をテストする

Railsアプリケーションで、ActiveRecord where メソッドを使用してプロパティがnilまたは空であるかどうかを確認する最もクリーンな方法は何ですか?

これはうまくいきますが、それを行うにはより良い、組み込みの方法があるはずです:

@items = Item.where :context => nil || ''

検索に「どこ?」などの語句が含まれていると、Google-fuで多くのことをするのは難しいです。

1
上記のコードはどこにあるでしょうか? Item.where:context.blank?()はフィルタリングされていないリストを返し、 Item.where:context => .blank?()は構文エラーを投げます。
追加された 著者 Josh Earl,
あなたの where は少し複雑ですが、 .blank?() はまったく役に立ちますか?
追加された 著者 sarnold,
@items = Item.where:context => nil || '' はヌル値をチェックしません。なぜなら、 nil || '' は評価されるので、結果のクエリは SELECT * FROM items WHERE context = ''
追加された 著者 stereoscott,

3 答え

あなたが持っているものはうまくいかないでしょう。

@items = Item.where context: nil || ''

本当に評価する:

@items = Item.where context: ''

したがって、このメソッドを使用して contextnil に設定したアイテムは見つかりませんでした。

サイドノート

thing ||を使うこのように他のは動作しません。 item == 'test'の場合、を書くことはできません|| 'something' であり、 item'何か' である場合に動作すると考えます。 item'test' の場合にのみ機能します。このようなものを動作させるには、item == 'test'の場合にを記述する必要があります。 item == '何か' 。これは人間の話ではありませんが、コンピュータの読み方です。

メインイベントに戻る

動作するクエリを作成する1つの方法は次のとおりです。

Item.where("context = ? or context = ?", nil, '')

contextnil または context であるすべての項目を '' とします。

これは動作しますが、特に "Rails-y"とはみなされません。より良い方法は次のとおりです:

Item.where(context: [nil, ''])

context[nil、 ''] にあるすべての項目を検索します。

関連する質問

16
追加された
これは正解です
追加された 著者 sixty4bit,
"""の両方を考慮したいので、 Item.where(" context =?or context =?or context =? " 、nil、 ''、 "")まもなく見つかった "" "" の両方がRubyの目で等しいので、
追加された 著者 Tass,

次の構文を使用できます。

Item.where(context: [nil, ''])
0
追加された

私はこのような列のデフォルト値を設定することでこの問題を回避したい。

それがオプションではない場合は、SQL節を使用する必要があります。

@items = Item.where "`items`.`context`='' OR `items`.`context` IS NULL"

私はSqueelの宝石(http://erniemiller.org/projects/squeel/)を使ってOR演算子を使いやすくしています。私はそれをチェックすることをお勧めします。 Squeelの例は次のとおりです。

@items = Item.where{context.eq('') | context.eq(nil)}
0
追加された