【Rails】Ransackを使って検索機能を簡単に実装する方法
はじめに
Railsのアプリケーションにおいて、データの検索機能は重要な要素です。検索機能を手軽に実装するために、RansackというGemを利用する方法を紹介します。この記事では、初心者向けにRansackを使った基本的な検索機能の実装方法を丁寧に解説します。
この記事を読むとわかること
- Ransackを使った検索機能の基本的な使い方
- 実務で活用できるコード例
- 複数の検索条件を設定する方法
- 検索結果のページネーション方法
Ransackとは?
Ransackは、Railsアプリケーションで検索機能を簡単に実装できるGemです。特に、複雑なクエリを簡単に作成でき、ActiveRecordのクエリビルダーを簡単に操作できるため、便利です。Ransackを使えば、検索条件に基づいてデータを絞り込む処理を簡単に作成できます。
Ransackを使った基本的な検索機能の実装
まずは、RailsでRansackを使って検索機能を実装するための準備をしましょう。
Ransackのインストール
まず、GemfileにRansackを追加します。
gem 'ransack'
その後、bundle installを実行して、Gemをインストールします。
bundle install
モデルに検索機能を追加
次に、検索対象となるモデルにRansackの検索機能を追加します。たとえば、Product
モデルを検索対象にする場合、以下のように設定します。
# app/models/product.rb class Product < ApplicationRecord # Ransackを使うための設定 def self.ransackable_attributes(auth_object = nil) super + ['name', 'price'] end end
ここでは、name
とprice
という属性で検索を行えるようにしています。
コントローラーで検索を処理
次に、コントローラーで検索を処理します。index
アクションで検索条件を受け取り、結果を表示するためのコードは以下のようになります。
# app/controllers/products_controller.rb class ProductsController < ApplicationController def index @q = Product.ransack(params[:q]) # 検索条件を受け取る @products = @q.result(distinct: true) # 検索結果を取得 end end
ここでは、params[:q]
で渡された検索条件を使って、Product
モデルから検索結果を取得しています。
ビューで検索フォームを作成
次に、検索フォームをビューに作成します。form_with
ヘルパーを使って、検索フォームを作成することができます。
<!-- app/views/products/index.html.erb --> <%= search_form_for @q do |f| %> <div> <%= f.label :name_cont, "商品名" %> <%= f.text_field :name_cont %> </div> <div> <%= f.label :price_gteq, "価格(最低)" %> <%= f.number_field :price_gteq %> </div> <div> <%= f.submit "検索" %> </div> <% end %> <ul> <% @products.each do |product| %> <li><%= product.name %> - <%= product.price %>円</li> <% end %> </ul>
ここでは、商品名(name
)と価格(price
)で検索できるようにしています。name_cont
は「部分一致検索」、price_gteq
は「価格が指定した値以上」という検索条件です。
結果を表示
検索結果は、@products
に格納されているので、これをビューで表示します。上記のコードでは、検索結果として表示する商品名と価格をリスト表示しています。
複数の検索条件を設定する方法
Ransackでは、複数の条件を組み合わせて検索を行うことができます。たとえば、商品名と価格を両方指定して検索する場合、以下のように条件を追加できます。
<%= search_form_for @q do |f| %> <div> <%= f.label :name_cont, "商品名" %> <%= f.text_field :name_cont %> </div> <div> <%= f.label :price_gteq, "価格(最低)" %> <%= f.number_field :price_gteq %> </div> <div> <%= f.label :price_lteq, "価格(最高)" %> <%= f.number_field :price_lteq %> </div> <div> <%= f.submit "検索" %> </div> <% end %>
これで、商品名と価格の範囲で絞り込むことができます。Ransackは複数の検索条件を簡単に組み合わせて処理できるため、便利です。
検索結果のページネーション
検索結果が多くなると、ページネーションを実装することが重要です。kaminari
やwill_paginate
などのGemを使うと、簡単にページネーションを追加できます。以下は、kaminari
を使った例です。
Kaminariのインストール
gem 'kaminari'
インストール後、bundle install
を実行します。
コントローラーの変更
@products
にページネーションを追加します。
# app/controllers/products_controller.rb class ProductsController < ApplicationController def index @q = Product.ransack(params[:q]) @products = @q.result(distinct: true).page(params[:page]).per(10) # ページネーションを追加 end end
ビューでページネーションを表示
<!-- app/views/products/index.html.erb --> <%= paginate @products %>
これで、検索結果が10件ごとにページ分けされて表示されるようになります。
まとめ
Ransackを使うと、Railsアプリケーションに簡単に検索機能を追加できます。初心者でも手軽に実装でき、複数の条件を組み合わせた高度な検索も可能です。さらに、ページネーションを追加することで、大量のデータを効率的に表示することができます。ぜひ、実務に活かしてみてください。