web-dev-qa-db-fra.com

Rails scope for IS NOT NULL and is not empty / blank?

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.

43
Shpigford

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 <> ''") }
45
Jordan Running

Dans Rails 4 vous pouvez faire

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

Rails 4

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

Utilisation text_value <> '' pour couvrir efficacement les deux cas.

Sera uniquement TRUE pour un text_value qui n'est ni NULL ni empty.

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

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!

1
yivo