woshidan's loose leaf

ぼんやり勉強しています

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_fieldxxx_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_fieldxxx_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) %>

参考

github.com

*1:sort_urlヘルパーでurlだけ生成することも可能です