検索機能の実装
検索機能の実装
railsで検索機能を実装するのに[ransack]Gemを使う。
[ransack Gemの利用手順]
Gemfileに以下のように記載する。
[Gemfile] gem "ransack"
↓
$ bundle install
↓
コントローラに以下のように記載する。
[app/controllers ファイル] def index @q = Board.ransack(params[:q]) @boards = @q.result(distinct: true) end
↓
検索フォームを記載するビューファイルに以下のように記載する。
[app/views ファイル] <%= search_form_for @q do |f| %> <%= f.search_field :title_or_body_cont %> <%= f.submit %> <% end %>
※ポイント
・[search_form_for]でURLを指定しないと、indexアクションにフォーム欄のパラメータが行く。(デフォルト以外にパラメータを送って実行したい場合は、そのアクションのURLを記載する。)
・検索条件(文字を含むや、以上、以下など)は、[f.search_field]の後に[カラム名_マッチャー(公式ドキュメント記載)]のようにして記載する。
・[distinct: true]を記載するのは、関連する子テーブルの情報を検索条件に使って、親テーブルの検索結果を表示するとき。
例えば、検索条件が「railsというコメントがついている掲示板を取得する」という場合に同じ掲示板にrubyというコメントが2つ以上あった場合に、同じ掲示板を複数取得してしまう為、[distinct: true]を使うとそれを防げます。
・[@q = Board.ransack(params[:q])]で、検索オブジェクト(検索フォームで入力した値とその条件(一致や含むなど))を取得している。
Boardテーブル以外から検索条件を適用して、データを取得したい場合は[@q = current_user.bookmark_boards.ransack(params[:q])]のようにする。
・[@boards = @q.result(distinct: true)]で、検索条件を使って対応しているテーブルからデータを取得する。
・[search_form_for]に渡すURLにidを含めるのは、ふさわしくない。
参考記事:
Rubyon Rails で検索機能を作ろう(ransack) - Qiita
【Rails】 ransackを使って検索機能がついたアプリを作ろう! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト
ransackで検索機能を実装 - Ruby on Railsの備忘録