Подтвердить что ты не робот

Рельсы, где условие с нулевым значением

Я узнал, что использование где с символом: 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, я удивляюсь, потому что я ожидаю, что он должен дать тот же результат.

4b9b3361

Ответ 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))

больше