前提
過去の関連質問
teratail --【Rails】クックパッド料理教室のようなモデル関連付け
したいこと...。
user.entries
をeach
で1つずつブロック変数entry
に取り出し、
entry → event_date → event → host
みたく遡り
host.name
を出力する過程でn+1問題
が起きているようです。
(もっと優れた方法もきっとあるかもしれません...。)
コントローラ
def show @entries = current_user.entries end
ビュー
thead tr th #{fa_icon 'calendar-o' ,class:'fa-fw'}日程 th #{fa_icon 'clock-o' ,class:'fa-fw'}時間 th #{fa_icon 'circle-o' ,class:'fa-fw'}イベント th #{fa_icon 'building-o' ,class:'fa-fw'}ホスト tbody - @entries.each do |entry| tr - @event = entry.event_date.event - @host = @event.host td #{entry.event_date.date.strftime("%m/%d")} td #{entry.event_date.time.strftime("%H時%M分")}〜 td #{@event.title} td #{@host.name}
モデル
下記はuser.rb
です。
ruby:
1class User < ApplicationRecord 2 has_many :entries ,dependent: :destroy 3 has_many :event_dates ,through: :entries 4 has_many :events ,through: :event_dates 5 has_many :hosts ,through: :events 6
下記はentry.rb
です。
ruby:
1class Entry < ApplicationRecord 2 belongs_to :event_date, counter_cache:true 3 belongs_to :user 4
下記はevent_date.rb
です。
ruby:
1 2class EventDate < ApplicationRecord 3 belongs_to :event ,optional: true 4 has_many :entries ,dependent: :destroy 5 has_many :users ,through: :entries 6
下記はevent.rb
です。
ruby:
1 2class Event < ApplicationRecord 3 belongs_to :host 4 has_many :event_dates ,dependent: :destroy 5
下記はhost.rb
です。
ruby:
1class Host < ApplicationRecord 2 has_many :events ,dependent: :destroy 3 has_many :event_dates ,through: :events 4 has_many :entries ,through: :event_dates 5 has_many :users ,through: :entries 6
gem 'bulletの報告内容
gem 'bullet
の報告によると、
eager loading detected Entry => [:event_date] Add to your finder: :includes => [:event_date]
...と出ますので、コントローラ
を以下のように変更しました。
def show @entries = current_user.entries.includes(:event_date) end
その後、gem 'bullet
の報告が
eager loading detected EventDate => [:event] Add to your finder: :includes => [:event]
...へ変わりましたので、試行錯誤...。
しかしわかりませんでした...。ビュー内
でも色々試行錯誤しましたが、
N+1問題解決ならず。ご助力いただけると幸いです。宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/07/10 11:30