web-dev-qa-db-ja.com

Rails IS NOT NULLであり、空/空白ではありませんか?

私のスコープは次のとおりです。

scope :comments, :conditions => ['text_value IS NOT NULL']

しかし、条件に「OR text_value IS NOT EMPTY」(またはその効果があるもの)」と言ってほしい。

text_valueが空/空白の行を選択したくありません。

43
Shpigford

アーウィンが指摘するように、単純なtext_value <> ''この場合、比較が機能します。

scope :comments, where("text_value <> ''")

(Rails 3は、オプションハッシュではなく、scopefindallなどのこのクエリ構文を優先します。例::conditions => ...。後者は Rails 3.1 で非推奨)。

Rails 4では、2番目の引数は代わりにラムダである必要があります。

scope :comments, ->{ where("text_value <> ''") }
45
Jordan Running

Rails 4でできること

where.not(text_value: '')
57
Patrick Oscity

Rails 4

scope :comments, -> { where.not(:text_value => nil) }
29
miclle

text_value <> ''を使用して、bothケースを効率的にカバーします。

TRUEでもNULLでもないtext_valueの場合は、emptyのみになります。

8
scope :comments, where("text_value <> ''")
3
maprihoda

個人的に私はこのようにしています:

1)初期化子に追加

class Arel::Attributes::Attribute
  # Encode column name like: `posts`.`author_id`
  def to_sql
    "`#{relation.table_name}`.`#{name}`"
  end

  def is_not_empty
    "#{to_sql} <> ''"
  end
end

2)モデルに追加する

scope :comments, -> { where(arel_table[:text_value].is_not_empty) }

幸運を!

1
yivo