Ruby on Rails ActiveRecord, где свойство не пустое

Я пытаюсь найти записи, где указанное свойство не пусто или пусто. Поскольку это строка, она не является нулем в базе данных.

Post.where(:sourceurl != '')

Вышеприведенное похоже, что оно должно работать, но я все равно получаю записи, возвращаемые там, где свойство source_url пусто. Каков правильный способ сделать это?

Ответы

Ответ 1

попробуйте это

Post.where("sourceurl <> ''")

Ответ 2

ActiveRecord (в rails 3 и 4, я думаю) позволяет проверять несколько условий, передавая массив в качестве аргумента. Поэтому, если вы хотите проверить как nil, так и '', вы можете использовать:

where(sourceurl: [nil, ''])

В Rails 4 вы можете проверить отрицательное условие с .not, поэтому для исходного вопроса вы можете сделать:

Post.where.not(sourceurl: [nil, ''])

.not имеет немного магии, что делает его выгодным для чистого SQL-запроса, потому что он работает в разных базах данных, не выполняет NULL-запросы автоматически и еще несколько вещей, как описано здесь: где не указано

Ответ 3

Rails 4

Состояние активной записи:

where.not(value: '')

Область применения:

scope :myscope, -> { where.not(value: '') }

Ответ 4

Причина, по которой ваш код не работает, заключается в том, что ваш параметр #where равен

:sourceurl != ''

который оценивается как true, поскольку :sourceurl (символ) не равен '' (пустая строка). Таким образом, ваш код будет таким же, как

Post.where(true)

Чтобы уточнить ответ abhas, MySQL и PostgreSQL будут принимать != и <> как эквивалентные.

Ответ 5

Если это поле по умолчанию имеет значение NULL в вашей базе данных, я думаю, что лучший способ разрешить его использовать простой SQL:

Post.where("sourceurl is not null")

Ответ 6

В postgresql, чтобы поймать как пустую строку, так и нуль, вы можете сделать:

where("coalesce(sourceurl, '') != ''")