質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

0回答

1379閲覧

Gmaps4rail マーカーに設置したリンクから飛ぶとN+1問題が発生する

besuko

総合スコア16

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2016/07/25 12:20

編集2022/01/12 10:55

##環境
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問