読者です 読者をやめる 読者になる 読者になる

ransack で複数カラムを検索する

rails

activerecord-hackery/ransack を使ってみました。

Gemfileに書いて、検索ロジックをちょろっと変更して、viewをちょろっと修正すれば
検索画面がすぐできちゃう優れものです。
詳細はactiverecord-hackery/ransack

 

複数のカラムで検索させる方法

例えば title と description を検索対象にしたい場合はどうするのか?
簡単すぎで拍子抜けました。

view
viewのname属性を or でつなげておくだけ。
title_or_description_cont としておけば良いです。簡単!

<%= f.text_field :title_or_description_cont, class: "form-control", placeholder: "検索" %>

controller

    def index
      @q = Article.published.ransack(params[:q])
      @articles = @q.result.page(params[:page])
    end

生成されるSQL

logger.info Article.published.ransack(params[:q]).result.to_sql
SELECT "Articles".* FROM "articles" WHERE "articles"."status" = 1 
AND ("articles"."title" LIKE '%テスト%' OR "articles"."description" LIKE '%テスト%') 
ORDER BY "articles"."created_at

余談

これもgithubに書かれていますが、現在は、ransack/search どちらでも動作します。

Article.ransack(params[:q])
Article.search(params[:q])

が、searchメソッドは Ransack (2.0) で deprecated となる予定なので ransack を使っとくのが吉です。