##環境
ruby 2.1.0
Rails 4.1.0
ransack 1.7.0
##GoogleMapsマーカーのInfoWindowに設置したリンクをクリックするとN+1問題が発生する
複数のItem(子モデル)を持つShop(親モデル)があります。
「Shopを特定したItem一覧ページ(本来Shopのshowページ)」と
「Shopを特定せず全てのItem結果を返す場合」をItem.indexに作りました。
items.indexにはShop位置をマーカーで示すGoogleMapsを設置しています。
マーカーをクリックすると、インフォウィンドウに店舗名のリンクを表示させます。
表示されたリンクをクリックすると、Shop.showではなくItem.indexに飛びます。
その際「N+1問題」が発生し、店舗IDが"2"の場合、店舗IDが"3"のページを表示してしまします。
(同じリンクを貼った店舗一覧では「N+1問題」は発生しませんが、GoogleMapsのマーカーリンクだけこのような挙動を発生します)
includesメソッドで対処しても挙動が変わらず、困っております。
何かヒントだけでも頂けませんでしょうか。。
ターミナル ※Shop.id:"2"を選んだ場合 tarted GET "/shops/3/items" for 10.0.2.2 at 2016-07-25 12:19:21 +0000 Processing by ItemsController#index as HTML Parameters: {"shop_id"=>"3"} Shop Load (0.6ms) SELECT `shops`.* FROM `shops` WHERE `shops`.`id` = 3 LIMIT 1 Item Load (1.7ms) SELECT `items`.* FROM `items` WHERE `items`.`shop_id` = 3 Shop Load (1.1ms) SELECT `shops`.* FROM `shops` WHERE `shops`.`id` = 3 LIMIT 1 CACHE (0.1ms) SELECT `shops`.* FROM `shops` WHERE `shops`.`id` = 3 LIMIT 1 [["id", 3]] Rendered items/_item.html.erb (52.8ms) Rendered items/index.html.erb within layouts/application (116.7ms) Completed 200 OK in 1534ms (Views: 1495.5ms | ActiveRecord: 3.5ms) user: vagrant http://localhost:4000/shops/3/items N+1 Query detected Item => [:shop] Add to your finder: :includes => [:shop] N+1 Query method call stack
routes.rb Rails.application.routes.draw do resources :shops do resources :items end end
models/shop.rb class Shop < ActiveRecord::Base belongs_to :user has_many :items , dependent: :destroy
items_controller.rb def index #Shopを特定する場合 if params[:shop_id] @shop = Shop.find(params[:shop_id]) @q = @shop.items.ransack(params[:q]) @items = @q.result(distinct: true).includes(:shop) #GoogleMaps @hash = Gmaps4rails.build_markers(@shop) do |shop, marker| marker.lat shop.latitude marker.lng shop.longitude marker.infowindow shop.name marker.json({title: shop.name}) end #Shop特定せず全てのItemを返す else @q = Item.ransack(params[:q]) @q.sorts = 'bake_time1 asc' if @q.sorts.empty? @items = @q.result(distinct: true).includes(:shop) #GoogleMaps @hash = Gmaps4rails.build_markers(@items) do |item, marker| shop_path = view_context.link_to item.shop.name, shop_items_path(item[:id]) marker.lat item.shop.latitude marker.lng item.shop.longitude marker.infowindow "<b>#{shop_path}</b>" marker.json({title: item.shop.name}) end end respond_with(@items) end
あなたの回答
tips
プレビュー