RailsでLIKE句のキーワードをサニタイズする
RailsでLIKE句のキーワードをサニタイズする場合、sanitize_sql_likeヘルパーを使います。
下記のようにモデルにスコープを定義しLIKE句で検索してみます。
class Setting < ApplicationRecord scope :search, ->(keyword) { where('setting_key like ?', "%#{sanitize_sql_like(keyword)}%") } end
このメソッドをrails cで実行してみます。
[2] pry(main)> Setting.search("100%abc") Setting Load (0.7ms) SELECT `settings`.* FROM `settings` WHERE (setting_key like '%100\\%abc%')
%がエスケープされます。
[6] pry(main)> Setting.search("100_abc") Setting Load (6.0ms) SELECT `settings`.* FROM `settings` WHERE (setting_key like '%100\\_abc%')
_がエスケープされています。
[9] pry(main)> Setting.search("100\\abc") Setting Load (0.6ms) SELECT `settings`.* FROM `settings` WHERE (setting_key like '%100\\\\abc%')
\がエスケープされています。