LoginSignup
7
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-06

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

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

7
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9