Rails ActiveRecordのSQLでLIKE検索をエスケープ

スポンサーリンク

Rails で ActiveRecord を使って LIKE 検索をする際に、LIKE に渡す文字列をエスケープする方法です。ワイルドカードとして使われる ‘%’, ‘_’ の文字、およびデフォルトでのエスケープ用文字である ‘\’(バックスラッシュ)が、LIKE に渡す文字列に含まれる場合にエスケープする必要がある。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

例えば、”100%完成” みたいな文字列を LIKE 検索にそのまま渡すと、% がワイルドカードとして使われてしまうので、それを防ぐために “100\\%完成” とエスケープする必要がある。バックスラッシュは文字列でもエスケープ用キャラクタとして使われるので、LIKE検索に渡す際にはバックスラッシュが2つ必要なことにも注意。

— 環境 —
Rails 4.0.1

独自に escape_like メソッドを実装

LIKE 検索時に使える API が Rails では特に用意されていなさそうだったので、以下のメソッドを作りました。

この escape_like メソッドは、実は Sequel という Ruby 用の別の ORM ライブラリからの拝借です。

Method: Sequel::Dataset#escape_like — Documentation for jeremyevans/sequel (master)

使うコントローラー/モデルの private メソッドとして作成する。あるいは、色んな箇所で使う場合は ApplicationController に定義するか、ActiveRecord::Base そのものにクラスメソッドとして追加したほうが便利です。私は以下の方法で ActiveRecord 自体を拡張しました。

ActiveRecord::Base にクラスメソッドとして追加

ActiveRecord::Base をオープンして escape_like クラスメソッドを追加すると、モデルのクラスメソッドとして利用でき、場所を選ばずどこでも使えます。以下 pry での実行。

アプリケーションのコードとしては、lib 以下にファイルを置いて initializers で require する方法が簡単です。

lib/active_record_extension.rb

config/initiaizers/lib.rb

ActiveRecordをさらに便利にする方法の紹介 – Hello, world! – s21g

escape_like メソッドの使い方

以下のように使います。

where メソッドにプレースホルダーで渡す。

または、ActiveRecord に追加した場合は以下。

これで、Rails で SQL の LIKE を使うのが楽になりました。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!