Edited at

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

More than 1 year has passed since last update.


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にアクセスし、検索ワードを入力し、検索ボタンを押してみて下さい。

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