Ransakのちょっと変わった使い方

f:id:ihatov08:20160729232114j:plain
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ヘルパーに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 %>
パーフェクトRuby on Rails

パーフェクトRuby on Rails

コメントを残す

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