【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

ここでは、namepriceという属性で検索を行えるようにしています。

コントローラーで検索を処理

次に、コントローラーで検索を処理します。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は複数の検索条件を簡単に組み合わせて処理できるため、便利です。

検索結果のページネーション

検索結果が多くなると、ページネーションを実装することが重要です。kaminariwill_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アプリケーションに簡単に検索機能を追加できます。初心者でも手軽に実装でき、複数の条件を組み合わせた高度な検索も可能です。さらに、ページネーションを追加することで、大量のデータを効率的に表示することができます。ぜひ、実務に活かしてみてください。

Rubyをマスターしよう

この記事で学んだRubyの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。