アトトック代表の開発ブログ

プログラミングや会社のこと、写真、自転車のことなど書いてます。

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%')

\がエスケープされています。

実行環境