Рельсы, где условие с нулевым значением
Я узнал, что использование где с символом: my_id = > nil и использование старой школы с? отличается. Может ли кто-нибудь объяснить мне, почему?
MyTable.where("my_id = ? ", nil).first
SELECT `my_tables`.* FROM `my_tables` WHERE (my_id = NULL ) LIMIT 1
Не получает никаких данных
MyTable.where(:my_id => nil).first
SELECT `my_tables`.* FROM `my_tables` WHERE (`my_tables`.`my_id` IS NULL) LIMIT 1
Получить данные, у которых my_id равно null.
Какова наилучшая практика использования в рельсах?
Думаю, я не уточнил свой вопрос.
В моем приложении rails параметр запроса равен nil.
Существующим кодированием является MyTable.where(: my_id = > params [: id]). First
В таблице есть много записей, у которых my_id равно null.
Поэтому первая запись из таблицы берется без осознания.
Прежде всего, да, это проблема с нечистыми данными в таблице.
Чтобы решить эту проблему.
Я нахожу два решения
Решение 1
if params[:id].present?
MyTable.where(:my_id => params[:id]).first
end
Решение 2
MyTable.where("my_id = ? ", nil).first
Как вы знаете, если мы ставим (если условие все больше и больше), наше приложение будет работать медленнее, и это не будет функциональное программирование.
Когда я пробую решение 2, я удивляюсь, потому что я ожидаю, что он должен дать тот же результат.
Ответы
Ответ 1
Правильный синтаксис SQL - my_id IS NULL
, поэтому, если вы измените свой первый фрагмент на следующий, он будет работать:
MyTable.where("my_id IS ?", nil).first
Оба синтаксиса отлично подходят. Это зависит от ваших предпочтений. Однако, если это параметр и вы не знаете, будет ли он nil
или нет, вам лучше использовать:
MyTable.where(:my_id => parameter).first
Ответ 2
В rails 4 вы можете указать значение как null, используя новый синтаксис хэша.
MyTable.where(my_id: nil).first
Ответ 3
Для DB для NULL синтаксис должен быть
my_id IS NULL
Итак, вы можете указать его как:
MyTable.where("my_id is NULL ").first
Ответ 4
Я полагаю, это так называемая "рельсовая магия",
вы можете передавать диапазоны
Client.where(:created_at => (Time.now.midnight - 1.day)..Time.now.midnight)
становится
SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00'
AND '2008-12-22 00:00:00')
или если вы передаете подмножество
Client.where(:orders_count => [1,3,5])
рельсы будут делать
SELECT * FROM clients WHERE (clients.orders_count IN (1,3,5))
больше