&tag(Ransack); *目次 [#mbfa3f82] #contents *参考情報 [#ufc216e0] -[[activerecord-hackery/ransack:https://github.com/activerecord-hackery/ransack]] // 公式サイト -[[#370 Ransack - RailsCasts:http://railscasts.com/episodes/370-ransack?language=ja&view=asciicast]] -[[Ruby - Ransackのススメ - Qiita [キータ]:http://qiita.com/nysalor/items/9a95d91f2b97a08b96b0]] *概要 [#t14acaff] -Railsで検索画面を作るための(?)gem。 -Kaminariと組み合わせ、カラムクリックでソートすることもできる。 *簡単な使い方 [#z3adda50] **インストール [#a39b267a] -Gemfileにransackを追加。 gem "ransack" **コントローラ [#n4975c64] -コントローラーのaction。例えばindexで検索する場合次のようになる。 #pre{{ def index @search = Item.ransack(params[:q]) @items = @search.result end }} ※searchじゃなくてransackメソッドのほうが推奨になったらしい(公式サイト) **ビュー [#x2d55501] -検索条件を指定するフォームの作成 #pre{{ <%= search_form_for @search do |f| %> <%= f.text_field :title_cont %> <%= f.submit '検索' %> <% end %> <% @items.each do |item| %> (省略) <% end %> }} *複雑な使い方 [#sc45293f] **ransack_demo [#f2c86b7b] [[ernie/ransack_demo:https://github.com/ernie/ransack_demo]]と、それを解説した[[#370 Ransack - RailsCasts:http://railscasts.com/episodes/370-ransack?language=ja&view=asciicast]]が参考になる。 ***セットアップ [#b9902986] -git clone git clone https://github.com/ernie/ransack_demo -bundle install bundle install --path vendor/bundle -データベース作成(postgresqlが必要。[[MacPorts/postgresql]]。ransack_demoユーザーを作成しておく) bundle exec rake db:create:all -テーブル作成 bundle exec rake db:migrate -テストデータ投入 bundle exec rake db:fixtures:load -サーバー実行 bundle exec rails s -ブラウザから http://localhost:3000 にアクセス *ビュー [#s2e33ac9] **search_form_for [#oe9ebf24] -search_form_forの定義は次のようになっている #pre{{ def search_form_for(record, options = {}, &proc) }} -最も単純 <%= search_form_for(@search) do |f| %> -クラスとurlを指定 <%= search_form_for(@search, url: items_path, html: {class: 'form-inline'}) do |f| %> *Tips [#q479a17d] **orderを手動で指定したい場合 [#n4cd42c5] -[[Sorting in the Controller · activerecord-hackery/ransack Wiki:https://github.com/activerecord-hackery/ransack/wiki/Sorting-in-the-Controller]]に方法が書いてある #pre{{ @search = Post.ransack(params[:q]) @search.sorts = 'name asc' if @search.sorts.empty? #一つの場合 @search.sorts = ['name asc', 'created_at desc'] if @search.sorts.empty? # 複数の場合 @posts = @search.result.paginate(page: params[:page], per_page: 20) }} -params[:q][:s]に無理やり突っ込む方法は古い。 **orderを手動で指定したい場合(古い方法) [#p7643075] -params[:q][:s]にORDER BYの値を渡してやる。 params[:q][:s] = "rating desc" -もしくはresult.orderでソート。 @search.result.order("rating desc") **カラムクリックしたときの初回のソートの向きを指定したい [#rd598170] -sort_linkのdefault_orderを指定する。 <%= sort_link(@q, :name, 'Last Name', default_order: :desc) %> **カラムクリックしたとき、セカンドキーを指定したい(2番目以降は固定) [#g76343ea] -カラムのシンボルの後に、ソートに使う配列を指定する。以下の場合:last_nameと'first_name asc'でソートすることになる。 <%= sort_link(@q, :last_name, [:last_name, 'first_name asc'], 'Last Name') %> -カラムをクリックすると、「last_name asc」「last_name desc」のあと「first_name asc」が組み合わさってソートされる。 -first_nameの方向は入れ替わらないことに注意。 **カラムクリックしたとき、セカンドキーを指定したい(2番目以降もトグル) [#yc3d7103] -ソート配列はシンボルにして、default_orderで初期ソート方向を指定する。 #pre{{ <%= sort_link(@q, :last_name, %i(last_name first_name), default_order: { last_name: 'asc', first_name: 'desc' }) %> }} **テーブルカラムと対応しない列で並べ替える場合 [#z755b783] -上の応用となる。sort_orderにリストで選択された"ソート順"が入っているとする。そのソート順からORDER BYの文字列を作ってやりセットする。 params[:q][:s] = build_sql(params[:sort_order]) -view側で、params[:sort_order]を初期値としてセットしてやれば条件も引き回せる。 **検索条件の引き回し [#qc51926a] -検索フォームとページングのナビゲーションを組み合わせて使う場合、検索ボタンを押して検索したパラメータが、ページングのナビゲーションに追加されて検索条件が引き回されることになる。 -検索条件を変えたら、いったん検索しないといけない。