Rails: использование named_scope, который запускает MySQL «в» - PullRequest
2 голосов
/ 30 июня 2010

ПРОБЛЕМА:

Я хочу выполнить запрос, который вызовет что-то вроде

select * from users where code in (1,2,4);

с использованием named_scope.


ЧТО Я ПОПЫТАЛ:

Это для одного кода:

named_scope :of_code, lambda {|code| {:conditions => ["code = ?", code]}}

Я пробовал что-то вроде

named_scope :of_codes, lambda {|codes| {:conditions => ["code in ?", codes]}}

и отправлено

user.of_codes('(1,2,4)')

это вызывает select * from users where code in '(1,2,4)', что вызывает ошибку MySQL из-за лишних кавычек.

PS: В идеале я хотел бы отправить user.of_codes([1,2,4])

Ответы [ 3 ]

4 голосов
/ 30 июня 2010

Это будет работать, просто найдите и не подвергните вас атаке SQL-инъекций:

named_scope :of_codes, lambda { |codes|
  { :conditions => ['code in (?)', codes] }
}

User.of_codes([1, 2, 3])
# executes "select * from users where code in (1,2,3)"

Если вы хотите быть немного более ловким, вы можете сделать это:

named_scope :of_codes, lambda { |*codes|
  { :conditions => ['code in (?)', [*codes]] }
}

Затем вы можете вызвать его либо с Array (как указано выше): User.of_codes([1, 2, 3]), либо со списком аргументов кода: User.of_codes(1, 2, 3).

3 голосов
/ 01 июля 2010

Самый простой подход - использовать хэш для условий вместо массива:

named_scope :of_codes, lambda { |*codes| { :conditions => { :code => codes } } }

Это будет работать как положено.

User.of_codes(1, 2, 3) # => SELECT ... code IN (1,2,3)
User.of_codes(1) # => SELECT ... code IN (1)
2 голосов
/ 30 июня 2010

Вы можете попробовать следующие варианты:

named_scope :of_codes, lambda {|codes| {:conditions => ["code in "+codes]}}

и

user.of_codes('(1,2,4)')

РЕДАКТИРОВАНИЕ ДЛЯ ИСПОЛЬЗОВАНИЯ ПРОБЛЕМЫ С ИНЖЕКТОМ SQL

named_scope :of_codes, lambda {|codes| {:conditions => ["code in (?) ", codes]}}

и

user.of_codes([1,2,4])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...