RansackでRailsの検索を楽に作る
Railsで開発していると検索フォームを作成することがよくあると思います。 今日は、そのときよく使われるRansackについてまとめておこうと思います。
基本的な使い方
def index @q = User.ransack(params[:q]) @users = @q.result end
のように特定のパラメータが入った q
というリクエストパラメータのキーを渡すと部分一致検索や冒頭一致検索をしてくれます。
なお、resultメソッドの結果に対して、includesやpagingを利用することもできます。
Ransackのフォーム
Railsでフォームを作成するときはform_with(一昔前はform_forやform_tag)を使いますが、Ransackで上記の特定のパラメータが入った検索フォームを作るときは、search_form_for
を使います。
そして、検索用のキーには f.search_field
を使います。
<%= search_form_for @q do |f| %> <%= f.label :name_cont %> <%= f.search_field :name_cont %> <%= f.submit %> <% end %>
部分一致検索
あるキーに対し部分一致検索を行いたい場合、 f.search_field
に xxx_cont
を渡します。
<%= f.label :name_cont %> <%= f.search_field :name_cont %>
複数の属性に対して同時に部分一致検索を行わせることができて、その場合、
<%= f.label :name_or_mail_cont %> <%= f.search_field :name_or_mail_cont %>
のように _or_
で属性間を繋ぎます。
冒頭一致検索
あるキーに対し冒頭一致検索を行いたい場合、 f.search_field
に xxx_start
を渡します。
<%= f.label :name_start %> <%= f.search_field :name_start %>
冒頭一致検索も複数の属性に対してcontの場合と同様に同時に冒頭一致検索を行わせることができます。
<%= f.label :name_or_mail_start %> <%= f.search_field :name_or_mail_start %>
sort_linkで属性の値によってソートを行った結果を出す
また、Ransack gemでは、sort_link
というヘルパーを使って、指定した属性で並び替えた結果を出すリンクを簡単に生成することができます*1。
<%= sort_link(@q, :name) %>
参考
*1:sort_urlヘルパーでurlだけ生成することも可能です