не по запросу в RoR - PullRequest
       1

не по запросу в RoR

1 голос
/ 23 января 2011

В Ruby on rails 3 я хочу выполнить запрос к полю has_many модели следующим образом:

@project.items.where(:status => 1)

Проблема в том, что я пытаюсь получить прямо противоположный результатчем это.То, что я хочу, это все элементы @project, где статус не 1. Некоторое время искали ответ на этот вопрос, кто-нибудь?

1 Ответ

3 голосов
/ 23 января 2011

Есть много способов выполнить то, что вы пытаетесь сделать, однако, некоторые лучше, чем другие.Если вы будете всегда искать номер с жестким кодом (в данном случае, например, 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...