Подтвердить что ты не робот

Область Rails для IS NOT NULL и не пуста/пуста?

У меня есть следующая область действия:

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

Но я также хочу, чтобы условия говорили: "OR text_value IS NOT EMPTY" (или что-то в этом роде).

Я не хочу выбирать строки, где text_value пусто/пусто.

4b9b3361

Ответ 1

Как указывает Эрвин, в этом случае будет работать простое сравнение text_value <> ''.

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

(Rails 3 предпочитает этот синтаксис запроса для scope, а также find, all и т.д., а не хэш параметров, например :conditions => .... Последний устарел в Rails 3.1.)

В Rails 4 второй аргумент должен быть лямбдой:

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

Ответ 2

В Rails 4 вы можете сделать

where.not(text_value: '')

Ответ 3

рельсы 4

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

Ответ 4

Используйте text_value <> '' для эффективного покрытия обоих случаев.

Будет только TRUE для a text_value, который не является ни NULL, ни empty.

Ответ 5

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

Ответ 6

Лично я делаю вот так:

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

Удачи!