ransack便利ですよね。検索作るときはもうこれなしでは考えられません。
ところで、idを複数指定したい場合はどうするんだろうかな?と思って調べていたんですが、どうも複数の入力エリアを作ってそこに個別に入れていくという感じっぽかったのですが、これ面倒だなーと思ったので、カンマ区切りでid指定できるようにしてみました。
まずはView側から。複数IDの指定での抽出がやりたいので、_inを使います。
肝なのは、text_fieldへのvalueの展開ですが、配列をカンマ区切りで出力しています。
= search_form_for @q do |f| = f.label :id_in, 'ID' = f.text_field :id_in, {value: (params[:q].present? && params[:q][:id_in].present?) ? params[:q][:id_in].join(',') : ''} = f.submit 'Search'
次は、Controller側です。
params[:q][:id_in]の値はただの文字列なので、配列に変換しています。
ransackのソートを使っている場合、params[:q][:id_in]の値がまんま配列として渡ってくるので、配列である場合は何も処理しないようにしています(unlessの部分)。
class HogesController < ApplicationController def index search_by_ransack end private def search_by_ransack if params[:q].present? && params[:q][:id_in].present? unless params[:q][:id_in].is_a? Array params[:q][:id_in] = params[:q][:id_in].split(',').map{|v| v.strip} end end @q = Hoge.search(params[:q]) params[:page] ||= 1 @hoges = @q.result.page(params[:page]).per(10) end end
もっとスマートな方法があるかもしれませんが、やりたいことできたのでこれでOKとします。