Построение sql в ruby ​​на рельсах - PullRequest
1 голос
/ 22 августа 2010

Следующий SQL-запрос, который я пытаюсь запустить, возвращает строку sql_string " ВЫБЕРИТЕ ИД ИЗ ЛЮДЕЙ, ГДЕ ИД (" 16 ") ":

@ids = ["1", "6"]

sql_string = <<-SQL
  SELECT id
  FROM people
  WHERE id IN ("#{@ids}")
SQL

Может кто-нибудь помочь изменитьвышеупомянутый запрос, поэтому он создаст строку sql_string " ВЫБЕРИТЕ идентификатор из людей, ГДЕ ИД В (1, 6) "

Ответы [ 2 ]

2 голосов
/ 22 августа 2010

Простое добавление @ids в запросе объединит массив и даст вам "16".Вы захотите запустить @ids.join(','), чтобы разделить их запятыми.Кроме того, вам нужно заключить часть выражения в строку #{}.В противном случае он будет восприниматься как буквальный.

@ids = ["1", "6"]

sql_string = <<-SQL
  SELECT id
  FROM people
  WHERE id IN (#{@ids.join(',')})
SQL

PS Существует очень мало веских причин для ручной записи всего запроса SQL в Rails.Вы должны использовать ActiveRecord, чтобы сделать что-то вроде People.find_all_by_id(@ids).

0 голосов
/ 22 августа 2010

С фрагментом кода в одном из ответов выше, "@ids" не очищается.Это хорошо, если ваш код «знает», что «@ids» содержит только допустимые целочисленные идентификаторы, но очень опасно, если какой-либо идентификатор поступил из пользовательского ввода или URL-адреса.См .:

... для возможного решения.Это защищенный метод, поэтому мы должны вызвать через 'send', чтобы продемонстрировать его использование на консоли:

>> ActiveRecord::Base.send(:sanitize_sql_for_conditions, { :id => [1,6] }, :people)
=> "people.\"id\" IN (1,6)"

... т.е. вставить приведенный выше результат после ключевого слова SQL WHERE.Как сказано в предыдущем ответе, если у вас нет действительно сложного случая, который не может быть построен с использованием стандартных вызовов Rails (что действительно имеет место для Coderama, но может не подходить для будущих читателей), вы всегда должны избегать написания SQL сhand.

Имея это в виду, альтернативным способом создания сложных запросов является плагин "ez_where", на который стоит обратить внимание, если кто-то читает думает о том, чтобы прибегнуть к SQL:*http://github.com/ezmobius/ez-where

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