2015-10-20 140 views
1

我運行到哪裏我在與下面的行大規模的N + 1個問題一個問題:刪除/重構,以避免N + 1

<% @reports.each do |report| %> 
    <% (@[email protected]_week).each do |week_number| %> 
    <% if report.user.answers.where(week_number: @current_week).exists? %> 
     <%= image_tag report.user.avatar.url(:thumb), size: '30', class: 'img-circle media-object' %> 
     <%= link_to "#{report.user.first_name + ' ' + report.user.last_name}", weekly_report_path(report.user.id, week_number) %> 
     <%= report.user.due_date %> 
     <%= week_number %> 
    <% end %> 
    <% end %> 
<% end %> 

當你看到有一噸協會相互連接,我試圖找到一種方法來簡化這一點。

控制器代碼:

def index 
    @reports  = current_user.active_managements 
    @current_week = Time.zone.now.strftime('%V').to_i 
    @first_week = current_user.created_at.strftime('%V').to_i 
    end 

如何避免這裏的N + 1度的問題,是代碼很好,只是需要有預先加載,或者我應該重新寫 - 如果是這樣,任何建議?

子彈錯誤,我得到的是:

Reviewer => [:user] 
    Add to your finder: :includes => [:user] 
    index:15 which is: 
    <% if report.user.answers.where(week_number: @current_week).exists? %> 



    User => [:company] 
    Add to your finder: :includes => [:company] 
    navigation_links:21 which is: 
<li><%= link_to "Settings", edit_company_path(current_user.company) %></li> 

爲線

+0

你能分享你的報告和用戶模型的關係嗎? –

回答

1

在有限的信息,我將它採取快速刺:

在你的控制器,你需要渴望加載用戶及其答案:

@reports = current_user.active_managements.includes(user: [:answers, :avatar]) 

在視圖中,您需要更改y我們的'where'通過渴望加載的對象進行檢測和循環。注意:這沒有經過測試,我只是在刺探它。我希望它能帶給你正確的道路:

<% @reports.each do |report| %> 
    <% (@[email protected]_week).each do |week_number| %> 
    <% if report.user.answers.detect { |a| a.week_number == @current_week.to_s}.present? %> 
     <%= image_tag report.user.avatar.url(:thumb), size: '30', class: 'img-circle media-object' %> 
     <%= link_to "#{report.user.first_name + ' ' + report.user.last_name}", weekly_report_path(report.user.id, week_number) %> 
     <%= report.user.due_date %> 
     <%= week_number %> 
    <% end %> 
    <% end %> 
<% end %> 
+0

很高興看到current_user.company問題的解決方案as_well –