プログラミングのメモ帳

自分のメモとして残したいアウトプット

Railsで検索フォームを実装する(ransack)

Ruby on Railsで検索フォームを実装する方法。

ransackというgemを使って実装できる。
ちなみにransackは「くまなく探す」という意味らしい。凄い検索してくれそう。

githubレポジトリはこちら(https://github.com/activerecord-hackery/ransack)

gem 'ran sack'

$ bundle

Controllerの記述は

def index
    @q = User.ransack(params[:q])
    @users = @q.result(distinct: true)
end

のような形になります。
ちなみにdistinctをつけることでSQL
SELECT hoghoge FROM ~
から
SLECT DISTINCT hogehoge FROM ~
に変わります。(重複が無くなる)

Viewの方ではransackを入れたことにより
search_form_forヘルパーが使用できます。
これを使ってフォームエリアを作ります。

<%= search_form_for @q do |f| %>
    <%= f.label :name_cont %>
    <%= f.search_field :name_cont %>
    <%= f.submit %>
<%= end %>

フィールドの :name_cont は 「:nameカラムに対してcontで検索する」という意味になります。
contはSQLのLIKE句と同じ意味になります。
ここら辺のmatcherについては公式レポジトリのMatcher項に記載されています。
このようにransackはviewのmatcherとcontrollerのresultをカスタムして使う。