Тестирование на пустую строку в запросе ActiveRecord - PullRequest
1 голос
/ 13 ноября 2011

В приложении Rails, какой самый чистый способ проверить, является ли свойство нулевым или пустым, используя метод ActiveRecord where?

Это работает, но, похоже, должен быть более хороший, встроенный-в способ сделать это:

@items = Item.where :context => nil || ''

Трудно многое сделать с Google-фу, когда ваш поиск включает такие термины, как «где».

Ответы [ 3 ]

16 голосов
/ 24 декабря 2014

То, что у вас не получится.

@items = Item.where context: nil || ''

действительно оценивается как:

@items = Item.where context: ''

Таким образом, вы не найдете элементы с context, установленными на nil, используяэтот метод.

Примечание

Использование thing || other таким способом никогда не работает.Вы не можете написать if item == 'test' || 'something' и ожидать, что это сработает в тех случаях, когда item равно 'something'.Это будет работать только в тех случаях, когда item равно 'test'.Чтобы заставить что-то подобное работать, вам нужно написать if item == 'test' || item == 'something'.Это не то, как люди говорят, а то, как компьютеры читают.

Назад к основному событию

Один из способов написать запрос, который будет работать, это:

Item.where("context = ? or context = ?", nil, '')

Это читается как: найти все предметы, где context равно nil или context равно ''.

Хотя это работает, это не считается особенно "Rails-y».Лучшим способом было бы:

Item.where(context: [nil, ''])

Это читается как: найти все предметы, где context находится в [nil, ''].

Смежный вопрос

1 голос
/ 13 ноября 2011

Вы можете использовать этот синтаксис:

Item.where(context: [nil, ''])
0 голосов
/ 13 ноября 2011

Мне бы хотелось избежать этой проблемы, установив значение по умолчанию для таких столбцов.

Если это не вариант для вас, вам нужно будет использовать предложение SQL.

@items = Item.where "`items`.`context`='' OR `items`.`context` IS NULL"

Я использую самоцвет Squeel (http://erniemiller.org/projects/squeel/), что упрощает использование операторов OR. Я рекомендую проверить это. Пример с Squeel будет:

@items = Item.where{context.eq('') | context.eq(nil)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...