Railsの検索機能実装gem定番のransack。ちょっと変わった使い方です。
アソシエーションも簡単に実装できる
has_manyもbelongs_toもhas_many throughも簡単に実装できます。
controllers/orders_controller.rb
def index @q = Order.search(params[:q]) @orders = @q.result(distinct: true).page(params[:page]).per(20) end
views/orders/index.html.erb
<%= f.select :products_shop_id_eq, Shop.order(:name).map{|m| [m.name, m.id]}, {include_blank: true}, {class: 'form-control'} %>
viewでアソシエーションの通り記述してあげれば、検索できます。
distinct: trueで重複を避ける
controllerのdistinct: true
をつけると重複を避けてくれます。これがわからなくて実装に時間がかかりました!
link_toにparapmsを持たせれば検索された状態で表示される
link_toヘルパーにparamsを持たせるとすでに検索された状態で表示してくれます。
わざわざcontrollerやmodelでスコープ設定や、action、viewをわける必要はありません。
下記は@shopのshowページからorders/indexにlinkを飛ばしています。このリンクから飛ぶと@q, :'q[products_shop_id_eq]' => "#{@shop.id}"
でransack用のquery parameterを持たせているので、すでにこのshopで検索、絞り込まれた状態でorders/indexが表示されます!
<%= link_to @shop.name, orders_path(@q, :'q[products_shop_id_eq]' => "#{@shop.id}"), method: :get %>

- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
コメントを残す