Есть много способов выполнить то, что вы пытаетесь сделать, однако, некоторые лучше, чем другие.Если вы будете всегда искать номер с жестким кодом (в данном случае, например, 1), то будет работать следующее решение:
@project.items.where('status != 1')
Однако, если это значение не задано жестковы открыто уязвимы для SQL-инъекций, так как Rails не сможет (не сможет) избежать такого запросаВ результате, для разработчиков Rails предпочтительно использовать следующий синтаксис для большинства пользовательских условий (тех, которые не могут быть созданы с помощью Hash
):
@project.items.where(['status != ?', 1])
Этот синтаксис немного сбивает с толку, поэтому давайтемне пройти через это.В основном вы предоставляете предложение where
и значения Array
.Первое значение в массиве - это String
, представляющий запрос, который вы хотите выполнить.Везде, где вы хотите значение в этой строке, вы помещаете ?
.Это служит заполнителем.Затем вы добавляете элемент для каждый вопросительный знак в вашем запросе.Например, если бы у меня было следующее:
where(['first_name = ? AND last_name = ?', params[:first_name], params[:last_name]]
Rails автоматически сопоставит их с формированием запроса для вас.В этом процессе он также экранирует потенциально небезопасные символы, предотвращая инъекцию.
В общем, предпочтительно использовать синтаксис Array, даже для жестко заданного значения.Мне сказали, что чисто строковые условия в Rails 3.5 вызовут предупреждение (непроверенное), поэтому теперь не мешает использовать синтаксис Array.