地方でリモートワーク in Iwate

東京の受託開発会社でリモートワークしてます。

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