Область Rails для IS NOT NULL и не пуста/пуста?
У меня есть следующая область действия:
scope :comments, :conditions => ['text_value IS NOT NULL']
Но я также хочу, чтобы условия говорили: "OR text_value IS NOT EMPTY" (или что-то в этом роде).
Я не хочу выбирать строки, где text_value
пусто/пусто.
Ответы
Ответ 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) }
Удачи!