現在開発中のRailsアプリに検索機能を実装したいと思い、簡単に実装ができるgemとか何かないかなと調査してみました。

そしたら、検索機能にはransackというgemがよく利用されていることが分かり、ransackを導入することに至りました。

今回は、このransackというgemについてまとめていきたいと思います。

ransackとは

検索機能を簡単に実装することができるgemです。

検索機能以外にもソート機能も利用することができます。

検索機能は自前で実装しようとするとかなり手間が掛かると思われるので、簡単に実装できるようになるのは中々便利ですね。

導入

ransackはgemのパッケージとなっているので、gemfileに以下のコードを追加しgemをインストールします。

gem 'ransack'

はい、これでransackを利用する準備が整いました。

利用方法

検索機能

まずは、コントローラー側の処理を実装します。

画面に表示されている検索フォームにユーザーが入力し、サーバー側で検索用のパラメータを受け取ることを想定します。

そして、その情報を基にモデルを抽出する処理を実装します。

# 検索フォームの情報を基にSearchオブジェクトを作成
@q = User.ransack(params[:q])
# 検索結果の取得
@users = @q.result(distinct: true)

因みに、ransackメソッドは以前はsearchメソッドだったので間違って利用しないように気をつけましょう。

# 古いバージョン
@q = User.search(params[:q])

コントローラー側の実装が完了したら、次は画面に表示させる検索フォームを作成します。

テンプレートに以下のようなフォームを作成します。

= search_form_for @q do |f|
  f.label :name
  f.search_field :name_cont

  f.submit

ransackのヘルパーメソッドsearch_form_forに、コントローラー側で取得したSearchオブジェクト(@q)を引数として渡します。

そしてブロックの中に、Railsのform_withメソッドのようにフォームのタグを配置していきます。

ポイントとしては、フォームの引数にカラム名を指定していますが、このシンボル名の末尾に検索条件のマッチャを記述します。

こうすることで、フォームに入力した内容に対して検索条件を指定することができます。

ソート機能

ソートさせたいカラムに対してソートさせるためのリンクを貼ることができます。

その場合、ransackのヘルパーメソッドsort_linkを利用します。

例えば、モデルの名前属性(name)にソートさせるリンクを貼りたい場合、テンプレートに以下のようなコードを追加します。

= sort_link(@q, :name)

そうするとカラム名の部分がリンクとなり、クリックする毎に昇順・降順でソートされるかと思います。

検索マッチャ一覧

ransackで利用できるマッチャは以下の通りです。

ワード説明
*_eq
*_not_eq
等しい
等しくない
equal
not equal
*_gt
*_gteq
よりも大きい
よりも大きい(等しいものも含む)
grater than
grater than or equal
*_lt
*_lteq
よりも小さい
よりも小さい(等しいものも含む)
less than
less than or equal
*_cont部分一致contains value
*_or_*複数のカラムから検索
検索マッチャ一覧

更新日 : 2020年9月7日

投稿者: TWEI

趣味はプログラミング。 以前は仕事でプログラミングをやっていました。現在はWebエンジニアを目指して勉強中。 勉強で得た知識などをブログで発信していく予定です。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA