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をカスタムして使う。