J'ai la portée suivante:
scope :comments, :conditions => ['text_value IS NOT NULL']
Mais je veux aussi que les conditions disent "OU text_value IS NOT EMPTY" (ou quelque chose à cet effet).
Je ne souhaite sélectionner aucune ligne où text_value
est vide/vide.
Comme le souligne Erwin, un simple text_value <> ''
la comparaison fonctionnera dans ce cas.
scope :comments, where("text_value <> ''")
(Rails 3 préfère cette syntaxe de requête pour scope
— ainsi que find
, all
, etc. - plutôt qu'un hachage d'options, par exemple :conditions => ...
. Ce dernier est obsolète dans Rails 3.1 .)
Dans Rails 4, le deuxième argument devrait être un lambda à la place:
scope :comments, ->{ where("text_value <> ''") }
Dans Rails 4 vous pouvez faire
where.not(text_value: '')
Rails 4
scope :comments, -> { where.not(:text_value => nil) }
Utilisation text_value <> ''
pour couvrir efficacement les deux cas.
Sera uniquement TRUE
pour un text_value
qui n'est ni NULL
ni empty
.
scope :comments, where("text_value <> ''")
Personnellement, je fais comme ça:
1) Ajouter aux initialiseurs
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) Ajoutez à votre modèle
scope :comments, -> { where(arel_table[:text_value].is_not_empty) }
Bonne chance!