検索機能の実装

検索機能の実装

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の備忘録

gemのransackで複数カラムを検索対象にする方法 - Qiita

ransackでRailsアプリのヘッダーに検索機能をつける - Qiita