gpt4 book ai didi

ruby-on-rails - Ruby on Rails - Bullet/N+1

转载 作者:行者123 更新时间:2023-12-04 07:30:25 26 4
gpt4 key购买 nike

在 Rails 4 上。我最近为我的开发环境安装了 bullet gem 以清除我的应用程序的 N+1 查询。相关机型:

投稿 :属于类别和用户。有许多提交详细信息。

用户:有很多提交

分类: 有很多提交。属于奖项。

奖项:有很多类别(和通过类别提交)

投稿详情:属于投稿

在我提交的索引页中,我有一个 each do语句来显示当前用户所做的每次提交。

<% current_user.submissions.order('created_at DESC').in_groups_of(3, false) do |group| %>
<div class="row">
<% group.each do |submission| %>

之后,我会列出有关提交的信息,包括其关联的类别、奖项和提交详细信息。 Bullet 说我对这个声明有 N+1 个问题:
N+1 Query detected Submission => [:category] Add to your finder: :include => [:category]
N+1 Query detected Submission => [:user] Add to your finder: :include => [:user]
N+1 Query detected Submission => [:submission_details] Add to your finder: :include => [:submission_details]

每次我尝试添加 .includes对于所有这三个模型,它只选择我列出的第一个(这并不奇怪)。我想当涉及多个模型时我需要走不同的路线——也许是一个连接语句?

(当我将 :category 设为第一项时,它会添加此通知):
N+1 Query detected Category => [:award] Add to your finder: :include => [:award]

(所以我还需要在声明中包含一种使 Award 适合的方法,同样,通过类别提交了许多内容)。

所以假设我不能做一个 .includes对于三种不同的模型,还有其他方法可以解决这个问题吗?谢谢。

最佳答案

为了更清楚,让我让细节更明显:

class User < ActiveRecord::Base
has_many :submissions
end

class Submission < ActiveRecord::Base
belongs_to :category
belongs_to :user
has_many :submission_details
end

class SubmissionDetail < ActiveRecord::Base
belongs_to :submission
end

class Category < ActiveRecord::Base
belongs_to :award
has_many :submissions
end

class Award < ActiveRecord::Base
has_many :categories
has_many :submissions, through: :categories
end
如果我理解正确,对于您的 current_user,您正在列出他的提交。
对于每个提交,您要列出 submit_details 及其所属的类别。
对于每个类别,您也列出了奖项。
<% current_user.submissions.order('created_at DESC').in_groups_of(3, false) do |group| %>
<div class="row">
<% group.each do |submission| %>
...
<div><%= submission.category %></div>
<div><%= submission.category.award %></div>
<%= submission.submissions_details.each do |submission_detail| %>
...
<% end %>
<% end %>
</div>
<% end %>
您可以使用 includes 来消除 N+1 问题。以下列方式:
current_user.submissions.includes(:submission_details, :category => :award)
更多详情 includes请参阅:
  • Rails guides eager-loading-associations
  • Rails guides eager-loading-multiple-associations
  • Rails api - includes

  • 协会

    关于ruby-on-rails - Ruby on Rails - Bullet/N+1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23770065/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com