Railsで検索機能を実装する方法を現役エンジニアが解説【初心者向け】
初心者向けにRailsで検索機能を実装する方法について現役エンジニアが解説しています。検索機能は、ActiveRecordのwhereメソッドを利用することで実装できます。検索に必要な完全一致、範囲検索、部分一致、除外検索、複数の条件を解説しています。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Railsで検索機能を実装する方法について解説します。
そもそもRubyについてよく分からないという方は、Rubyとは何なのか解説した記事を読むとさらに理解が深まります。
なお本記事は、TechAcademyのオンラインブートキャンプRuby講座の内容をもとに紹介しています。
今回は、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>
筆者プロフィール
メンター稲員さん
フリーランスエンジニア。 経験言語:Ruby、Rails、Python、C/C++、Java、Perl、HTML/CSS3、JavaScript、CoffeeScript,Node.js。 |
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でもRuby on Railsを使ったプログラミングを習得できるオンラインブートキャンプRuby講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。