Help us understand the problem. What is going on with this article?

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

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

yoshito410kam
沖縄でのんびり暮らしている暇人です
http://utina.yoshitokamizato.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした