私のスコープは次のとおりです。
scope :comments, :conditions => ['text_value IS NOT NULL']
しかし、条件に「OR text_value IS NOT EMPTY」(またはその効果があるもの)」と言ってほしい。
text_value
が空/空白の行を選択したくありません。
アーウィンが指摘するように、単純なtext_value <> ''
この場合、比較が機能します。
scope :comments, where("text_value <> ''")
(Rails 3は、オプションハッシュではなく、scope
、find
、all
などのこのクエリ構文を優先します。例::conditions => ...
。後者は Rails 3.1 で非推奨)。
Rails 4では、2番目の引数は代わりにラムダである必要があります。
scope :comments, ->{ where("text_value <> ''") }
Rails 4でできること
where.not(text_value: '')
Rails 4
scope :comments, -> { where.not(:text_value => nil) }
text_value <> ''
を使用して、bothケースを効率的にカバーします。
TRUE
でもNULL
でもないtext_value
の場合は、empty
のみになります。
scope :comments, where("text_value <> ''")
個人的に私はこのようにしています:
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) }
幸運を!