2011-12-23 11 views

答えて

43

Erwinが指摘しているように、単純なtext_value <> ''の比較がこの場合に機能します。レール4に

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

(レール3 scope -asならびにfindall、等、よりもむしろオプションハッシュ例えば:conditions => ...このクエリ構文を好む。後者はdeprecated in Rails 3.1である。)

、第二引数ではなく、ラムダのようになります。

scope :comments, ->{ where("text_value <> ''") } 
+1

'NULL <> ''が' NULL'を生成するので、 'COALESCE()'はちょうどこのケースではうんざりです。 'TRUE'条件のみが行を修飾します。 –

+1

良いキャッチ、@ErwinBrandstetter。私は私の答えを更新しました。 –

+0

何について - スコープ:コメント( "NOT text_value IS NULL") – JoshOiknine

8

text_value <> ''を使用すると、の両方を効率的にカバーできます。

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

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

ORは間違った演算子です。これは空の 'text_value'を受け入れます。 –

+0

ええ、空TEXT_VALUEもNOT NULLである;) - それが修正だ、感謝 – maprihoda

+0

は今、それは正しいです。しかし、追加のテスト 'text_value IS NOT NULL'は必要ありません。私の答えと他のコメントを参照してください。演算子 '<>'と '!='は文字型(およびほとんどの他の型も同じ)です。 –

28

レール4

Railsでは
scope :comments, -> { where.not(:text_value => nil) } 
+8

これは元の質問のリクエストとしては機能しません。 – Backo

+0

@Backoに同意しますが、これを明確にするために、空白は除外されず、nilsだけが除外されます。 – Dty

47

4あなたは

where.not(text_value: '') 
+0

美しい解決策。 – Karl

+1

もちろん、Rails 4以降のベストアンサーは – Dty

+0

ですが、text_valueがnilの行は返されません。 – Doug

1

は個人的に私はこのようにやって行うことができます。

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) } 

幸運!

+0

[gem](https://github.com/yivo/arel-is-blank)があります。 – yivo

関連する問題