mar*_*ion 0 ruby-on-rails eager-loading ruby-on-rails-4
我有FamilyTree, Node, Comment, & User模特.
这种关系是这样的:
FamilyTree
class FamilyTree < ActiveRecord::Base
belongs_to :user
has_many :memberships, dependent: :destroy
has_many :members, through: :memberships, source: :user, dependent: :destroy
has_many :nodes, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)
Node
class Node < ActiveRecord::Base
belongs_to :family_tree
belongs_to :user
has_many :comments, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)
Comment
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :node
end
Run Code Online (Sandbox Code Playgroud)
User
class User < ActiveRecord::Base
has_one :family_tree, dependent: :destroy
has_many :memberships, dependent: :destroy
has_many :nodes, dependent: :destroy
has_many :comments
end
Run Code Online (Sandbox Code Playgroud)
Membership ## This is just to store the user memberships on various family_trees
class Membership < ActiveRecord::Base
belongs_to :family_tree
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
在我Dashboard#IndexController使用它的地方,我有:
def index
@family_tree = current_user.family_tree
@nodes = @family_tree.nodes.includes(:comments)
@node = current_user.nodes.new
@memberships = current_user.memberships.limit(3)
end
Run Code Online (Sandbox Code Playgroud)
当我尝试使用Bullet gem优化我的应用程序时,我收到以下消息:
N+1 Query detected
Comment => [:user]
Add to your finder: :include => [:user]
N+1 Query method call stack
Run Code Online (Sandbox Code Playgroud)
我的_comments部分是产生这种N + 1点的问题被称为这样的-在我的views/dashboard/index.html.erb:
<% @nodes.each do |node| %>
<%= render partial: "shared/comments", locals: {node: node} %>
<% end %> <!-- node -->
Run Code Online (Sandbox Code Playgroud)
这是在我的_comments部分中围绕这些行发生n + 1个违规查询的地方.
<% node.comments.each do |comment| %>
<li class="clearfix">
<a class="avatar" href="#">
<%= image_tag(comment.user.avatar.url)%>
Run Code Online (Sandbox Code Playgroud)
因此,似乎解决方案是优化我的控制器调用,但我不太确定如何进行2级关联.我试过这个:
@nodes = @family_tree.nodes.includes(:comments).includes(:user)
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有摆脱N + 1查询问题.
有任何想法吗?
你必须将哈希传递给 includes
@nodes = @family_tree.nodes.includes(:comments => :user)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1267 次 |
| 最近记录: |