私は、文字列の配列を受け入れるRubyメソッド(例えば、["EG", "K", "C"]
)を作成しようとしています。icao_code
フィールドのいずれかで始まるデータベーステーブルからすべてのレコードを返します。それらの文字列(例えば、KORD、EGLL、CYVRはすべて一致します)。配列の長さは変化し、ユーザーが入力するので、消さなければなりません。Ruby on Railsの任意の長さのLIKE句
1つの文字列に対してはAirport.where("icao_code LIKE ?", "#{icao_start}%")
のようなことができますが、任意の数の文字列に対して検索する必要があるため、その構文は使用できません。
今のところ、次のように働いて、それをotの:
def in_region(icao_starts)
where_clause = icao_starts.map{|i| "icao_code LIKE '#{i}%'"}.join(" OR ")
return Airport.where(where_clause)
end
しかし、私はそれがSQLインジェクションの脆弱性だろう疑うので、ビットは、信頼できないユーザの入力で、このような設定を使用して心配です。
より安全な方法で同じ結果を得るためのより良い方法はありますか?これは?
プレースホルダ(?潜在的に非常に長い)文字列を構築します
def in_region(icao_starts)
where_clause = "icao_code LIKE '#?%' OR " * icao_starts.length
return Airport.where(where_clause.sub(/\ OR\ $/, ''), *icao_starts)
end
:
を取り除くために正規表現を使用していません。私は 'map {| s |小文字を入力するユーザーを処理し、アルファベット以外の文字を削除するには、s.upcase.tr {"^ A-Z"、 ""}} 'を使用します。 – bogardpd