ransackでidをカンマ区切りで指定する方法

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とします。


カテゴリー Ruby, Ruby on Rails | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です