Ruby
Rails
ransack
RubyOnRails

Ransackでのデータベース検索機能実装

ransackとは

ransackはrails用の検索機能を実装するためのgemです。このgemを利用することにより、高機能なキーワード検索を実装できるようになります。例えば、検索キーワードが入力された場合には、そのキーワードに紐づいたデータを取得し、検索キーワードが入力されていない場合には全件検索を行う、といった柔軟な検索機能が実装できるようになります。

以下のgemを追加

gem 'ransack'
bundle install

データを登録するためのデータベースを作成します。まずは、modelを作成しましょう。modelの名前はuserにしてください。

rails g model user

作成されたマイグレーションファイルを以下のように編集しましょう。

class CreateUser < ActiveRecord::Migration[5.0]
  def change
    create_table :user do |t|
      t.string :name
      t.integer :age
      t.timestamps
    end
  end
end

マイグレーションファイルを編集したらマイグレートを実行し、テーブルを作成しましょう。

bundle exec rake db:migrate

次に、検索用のデータを投入します。今回は、seedの機能を利用してサンプルデータを作成します。以下のコードをdb/seeds.rbに記入しましょう。

User.create(name: '斉藤', age: 35)
User.create(name: '田中', age: 21)
User.create(name: '佐藤', age: 32)
User.create(name: '山岸', age: 33)
User.create(name: '平', age: 26)
User.create(name: '加藤', age: 25)

seeds.rbに用意したデータをUsersテーブルへ投入します。以下のコマンドを実行しましょう。

bundle exec rake db:seed

データを投入したら、検索メソッドを実装するためのモデルを作成しましょう。今回作成するモデルのファイル名はuser_search.rbです。user_search.rbファイルの作成が終わったら、そのファイルにUserSearchクラスを定義し、UserSearchクラスに検索用のexecuteメソッドを定義しましょう。その際、search_namesearch_ageのインスタンス変数を定義します。そのexecuteメソッドの中で、ransackの機能を利用します。

userモデルに検索用のメソッドを実装する場合、インスタンス変数の名前がテーブルのカラム名と同じ値になると、データが登録できない状態になるので注意が必要です

class UserSearch
  include ActiveModel::Model

  attr_accessor :search_name, :search_age

  def execute
    User.ransack(name_eq: @search_name, age_eq: @search_age).result
  end
end

モデルの編集が終わったら、次にルートを設定しましょう。routes.rbに以下のコードを追記してください。

get '/users/search', to: 'users#search'

ルートの設定が終わったら、usersコントローラに対応するアクションを記述します。そのため、まずはusersコントローラを作成しましょう。以下のコマンドを実行してください。

rails g controller users

usersコントローラが作成できたら、searchアクションを追加しましょう。検索フォームから送信されたparamsparams_user_searchメソッドから受け取るようにします。

def search
    user_search = UserSearch.new(params_user_search)
    @users = user_search.execute
end

private

def params_user_search
  params.permit(:search_name, :search_age)
end

usersコントローラのアクションが定義できたら、次は画面の作成に移ります。検索機能を実装するには、検索ワードを入力するための画面が必要なので、次に、検索用の入力画面を作成しましょう。usersディレクトリにsearch.html.erbを作成し、以下のコードを記述しましょう。

<%= form_tag('/users/search', method: :get) do %>
  <%= label_tag :名前 %>
  <%= text_field_tag :search_name %>
  <%= label_tag :年齢 %>
  <%= text_field_tag :search_age %>
  <%= submit_tag '検索' %>
<% end %>
<table>
  <tbody>
    <thead>
      <tr>
        <th>名前</th>
        <th>年齢</th>
      </tr>
    </thead>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.name %></td>
        <td><%= user.age %></td>
      </tr>
    <% end %>
  </tbody>
</table>

それでは、検索画面にアクセスし、動作確認をしましょう。サーバーを立ち上げた後、http://localhost:3000/users/searchにアクセスし、検索ワードを入力し、検索ボタンを押してみて下さい。

以上で検索機能の実装は終わりです。きちんとユーザーが検索できるか確かめて見ましょう。