【Rails】検索機能(ransack)

はじめに

ransackの実装の流れをメモしておきます。

gemのインストール

Gemfile

gem 'ransack'
$ bundle install

Controller

def index
    @q = Board.ransack(params[:q])
    @boards = @q.result(distinct: true).includes(:user).order(created_at: :desc).page(params[:page])
end

View

<%= search_form_for @q do |f| %>
  <div class="input-group mb-3">
    # ここで、titleとbodyを検索対象にしています。
    <%= f.search_field :title_or_body_cont, class: 'form-control', placeholder: '検索ワード' %>
    <div class="input-group-append">
      <%= f.submit '検索' ,class: 'btn btn-primary'%>
    </div>
  </div>
<% end %>

ransackにおけるdistinct: trueの必要性について

今回の例では、本当は必要ありませんが、 「関連する子テーブルの情報を条件に絞り込んで、親テーブルの検索結果を表示するとき」のケースの場合は必要になります。