2013-07-09 10 views
7

名前を含むPersonモデルがあり、できるだけ簡単に検索したい。Postgresでのレールのパターンマッチング( "where column LIKE '%foo%")

DataMapperのように、People.like(:name => "%#{query}%")の行に沿ってrails/ActiveRecordメソッドがありますか?私はActiveRecordのドキュメントでこのようなものを見つけることができませんでしたが、単純に不可能な場合は私はショックを受けました。

現在、私はPerson.where "name LIKE '%#{query}%'"を実行しています。これは素晴らしい動作ですが、明白なSQLインジェクションの脆弱性です。

のRails 3.2

+0

Isnt postgresはLIKEの代わりにILIKEを使用していますか? – sunny1304

+3

"LIKEの代わりにキーワードILIKEを使用すると、アクティブなロケールに応じて大文字と小文字を区別しないようにすることができます。これはSQL標準にはありませんが、PostgreSQL拡張です。 – AlexQueue

+0

よろしくお願いします。ありがとう。 – sunny1304

答えて

27

そうのように、SQL-注射を避けるために、代わりにパラメータ化クエリを使用してください:パーセント記号がパラメータの一部ではなく、where句かでなければならないことを

Person.where('name LIKE ?', '%' + query + '%') 

注意Railsはそれをエスケープし、構文エラーが発生します。 (少なくともpostgresに)

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "%" 
LINE 1: ...name LIKE %'John... 
        ^
関連する問題