Railsで検索機能を実装する方法を現役エンジニアが解説【初心者向け】

初心者向けにRailsで検索機能を実装する方法について現役エンジニアが解説しています。検索機能は、ActiveRecordのwhereメソッドを利用することで実装できます。検索に必要な完全一致、範囲検索、部分一致、除外検索、複数の条件を解説しています。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Railsで検索機能を実装する方法について解説します。

Rubyについてそもそもよく分からないという方は、Rubyとは何なのか解説した記事をまずご覧ください。

 

なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。
 

田島悠介

今回は、Rubyに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Railsで検索機能を実装する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

Railsでの検索機能の実装の手順

Railsでの検索機能は、ActiveRecordのwhereメソッドで実装できます。

whereメソッドについて詳しく見ていきましょう。
 

完全一致(数値)

一番簡単な使い方は、where(id: 1)のような書き方です。
以下のように書くとidが1のユーザー(厳密には ActiveRecord::Relation)を取得できます。

 

User.where(id: 1)

 

範囲検索

次に、idが2,3,4のユーザーを取得してみます。

特定カラムを範囲検索したい場合は、Range で指定できます。お好みで2…5と書いても同じ結果が得られます。

 

User.where(id: 2..4) # 2 <= x <= 4
User.where(id: 2..5) # 2 <= x < 5 なので、この書き方でも同じ結果が得られる

 

完全一致(文字列)

文字列型のカラムを完全一致で取得してみましょう。idで検索するときと同じです。

 

User.where(name: "hanako")

 

部分一致(文字列)

では、部分一致で調べたいときはどうすれば良いでしょうか?部分一致のときはLIKE句と?, %を組み合わせる必要があります。
 

User.where("name LIKE ?", "%hana%")

 

LIKE句はSQLの検索を行うための演算子です。
name LIKEと書くことでnameカラムを検索、という意味になります。

?は次の引数"%hana%"を受け取る場所になります。最終的にname LIKE "%hana%"という風になるということです。%は任意の文字列を指します。

つまり、nameカラムにhanaを含むレコードを抽出する、という処理になります。
 

除外検索

これまでと逆に、idが1でないもの、といった除外検索にはnotを組合せます。
検索条件を書く箇所がwhereの引数ではなく、notの引数となることに注意してください。

 

User.where.not(id: 1)

 

複数の条件を組み合わせる

複数の条件を組合せたい場合には、whereメソッドをチェーンしても良いですし、検索内容によっては 1つのwhereメソッドにまとめることもできます。

 

User.where(id: 1).where(name: "hanako")
User.where(id: 1, name: "hanako")

 

複数のテーブルから条件を絞り込む

事前にhas_manyやbelongs_toなどのアソシエーションが定義されていることが前提ですが、複数テーブルで条件を絞り込むことも可能です。

複数テーブルでの絞り込みを行う場合はjoinsやleft_joinsなどを組合せて使います。
また、どのテーブルのカラムかを明示する必要があります。

以下のように書くことで、hobbyグループに所属しているhanakoさん(たち)を取得できます。
 

User.joins(:group).where('users.name = "hanako" AND groups.name = "hobby"')

 

実際に書いてみよう

whereメソッドの使い方がわかったところで、検索機能を実装していきましょう。

今回作るものは「名前が部分一致するユーザーを検索」する機能とします。
事前にプロジェクトや、Userモデルやコントローラは作成されているものとします。
 

ルーティングの追加

まずはルーティングを追加しましょう。config/routes.rbを編集します。

以下のように書くことでGET /users/searchでUsersコントローラのsearch アクションにルーティングされるようになります。
 

resources :users do
  get :search, on: :collection
end

 

コントローラの編集

次にsearchアクションを作成します。app/controllers/users_controller.rb を編集します。

今回は「名前の部分一致」なので、LIKE句を使えば良いです。
検索文字列はnameフィールドへの入力とするので、params[:name]で取得すればOKです。
 

class UsersController < ApplicationController
  def search
    if params[:name].present?
      @users = User.where('name LIKE ?', "%#{params[:name]}%")
    else
      @users = User.none
    end
  end
end

 

ビューの追加

最後にViewファイルを作成しましょう。app/views/users/search.html.erb を作成します。

form_withを使って検索フォームを作成しています。
今回作ったsearchアクションへのルーティングはGETメソッドなのでmethod: :getのオプションを付けています。
また、AjaxがデフォルトでOnになっているため、local: trueのオプションも忘れないようにしてください。

検索結果は @usersに入っているので、eachで順次表示してあげれば完成です。
 

<h1>User search</h1>
<%= form_with url: search_users_path, method: :get, local: true do |f| %>
  <%= f.text_field :name %>
  <%= f.submit :search %>
<% end %>
<table>
  <thead>
    <tr>
      <th>Name</th>
    </tr>
  </thead>
  <tbody>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.name %></td>
      </tr>
    <% end %>
  </tbody>
</table>

 

[PR] Rubyのプログラミングで挫折しない学習方法を動画で公開中

筆者プロフィール

メンター稲員さん

フリーランスエンジニア。
大手SEからフリーランスのWeb系エンジニアにジョブチェンジ。

経験言語:Ruby、Rails、Python、C/C++、Java、Perl、HTML/CSS3、JavaScript、CoffeeScript,Node.js。
おうち大好きマンです。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

TechAcademyでは初心者でも最短4週間でエンジニアになれるRuby on Railsオンラインブートキャンプを開催しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。