最近掲示板の検索機能の実装方法を学んだのでこちらにアウトプットしておきます。
検索機能の実装
検索バーをransack
というgemを使って実装していきます。
Ransackはデータベースから特定の条件に一致するレコードを探すための検索クエリを生成する機能を提供します。
手順
①ransack
のインストール
②コントローラーの編集
③viewの編集
④国際化(任意)
①ransack
のインストール
Gemfileに以下のコードを記入
gem 'ransack'
$ bundle install
②コントローラーの編集
#編集前
def index
@boards = Board.all.includes(:user).order(created_at: :desc).page(params[:page])
end
↓↓
def index
@q = Board.ransack(params[:q])
@boards = @q.result(distinct: true).includes(:user).order(created_at: :desc).page(params[:page])
end
URLパラメータparams[:q]
(これが検索条件)を使用してBoardモデルに対する検索クエリを生成しています。
検索クエリ@q.result(distinct: true)
を実行し、その結果を取得しています。また、その結果から重複するレコードを除外するように指定(distinct: true)しています。
※掲示板Aに対して「rails1」というコメントと「rails2」というコメントがある場合、このdistinct: true
を入れないと、railsでコメントを検索した場合に、掲示板Aが2回取得されて検索結果が2件になってしまったり、エラーの原因にもなります。
④viewの編集
検索バーの実装はできている程で進めていきます。
パーシャルを作成します
<form>
<%= search_form_for @q do |f| %>
<div class="input-group mb-3">
<%= f.search_field :title_or_body_cont, class: "form-control", placeholder: "検索ワード" %>
<div class="input-group-append">
<%= f.submit '検索', class: 'btn btn-primary' %>
</div>
<% end %>
</div>
</form>
search_form_for
というransackが提供するフォームヘルパーを使ってフォームを作成。
※検索クエリのように一貫性が保たれる変数はインスタンス変数@qとしてパーシャルに渡し、特定の状況に依存する変数はローカル変数qとしてパーシャルに渡すことで、パーシャルの再利用性を高めることができます。
<%= render 'search_form', url: boards_path %>
これで掲示板一覧で検索機能を実装することができました。