2

問題:

次のようなトリガーとなるクエリを実行したい

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])

4

3 に答える 3

4

これは単に見つけて機能し、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)

于 2010-06-30T11:59:23.773 に答える
3

最も簡単な方法は、配列の代わりに条件にハッシュを使用することです。

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)
于 2010-06-30T22:21:25.723 に答える
2

あなたは次のことを試すことができます

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])
于 2010-06-30T10:55:07.733 に答える