Ответ 1
попробуйте это
Post.where("sourceurl <> ''")
Я пытаюсь найти записи, где указанное свойство не пусто или пусто. Поскольку это строка, она не является нулем в базе данных.
Post.where(:sourceurl != '')
Вышеприведенное похоже, что оно должно работать, но я все равно получаю записи, возвращаемые там, где свойство source_url пусто. Каков правильный способ сделать это?
попробуйте это
Post.where("sourceurl <> ''")
ActiveRecord (в rails 3 и 4, я думаю) позволяет проверять несколько условий, передавая массив в качестве аргумента. Поэтому, если вы хотите проверить как nil, так и '', вы можете использовать:
where(sourceurl: [nil, ''])
В Rails 4 вы можете проверить отрицательное условие с .not, поэтому для исходного вопроса вы можете сделать:
Post.where.not(sourceurl: [nil, ''])
.not имеет немного магии, что делает его выгодным для чистого SQL-запроса, потому что он работает в разных базах данных, не выполняет NULL-запросы автоматически и еще несколько вещей, как описано здесь: где не указано
Rails 4
Состояние активной записи:
where.not(value: '')
Область применения:
scope :myscope, -> { where.not(value: '') }
Причина, по которой ваш код не работает, заключается в том, что ваш параметр #where
равен
:sourceurl != ''
который оценивается как true
, поскольку :sourceurl
(символ) не равен ''
(пустая строка). Таким образом, ваш код будет таким же, как
Post.where(true)
Чтобы уточнить ответ abhas, MySQL и PostgreSQL будут принимать !=
и <>
как эквивалентные.
Если это поле по умолчанию имеет значение NULL в вашей базе данных, я думаю, что лучший способ разрешить его использовать простой SQL:
Post.where("sourceurl is not null")
В postgresql, чтобы поймать как пустую строку, так и нуль, вы можете сделать:
where("coalesce(sourceurl, '') != ''")