如何在一次通话中渴望加载两个级别的关联? [英] How do I eager load two levels of associations in 1 call?
问题描述
我有 FamilyTree,Node,Comment和&用户
模型。
这种关系是这样的:
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
Node
class Node < ActiveRecord::Base
belongs_to :family_tree
belongs_to :user
has_many :comments, dependent: :destroy
end
评论
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :node
end
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
会员##这只是为了存储各种用户的会员资格family_trees
class Membership < ActiveRecord::Base
belongs_to :family_tree
belongs_to :user
end
在我使用此控件的 Dashboard#IndexController
中,我有:
In my Dashboard#IndexController
where I am using this, I have:
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
当我尝试优化我的带有Bullet gem的应用程序,我会收到以下消息:
When I am trying to optimize my app with the Bullet gem, I get this message:
N+1 Query detected
Comment => [:user]
Add to your finder: :include => [:user]
N+1 Query method call stack
我的 _comments
部分被称为这样-在我的 views / dashboard / index.html.erb
中:
My _comments
partial that is generating this N+1 issue is called like this - in my views/dashboard/index.html.erb
:
<% @nodes.each do |node| %>
<%= render partial: "shared/comments", locals: {node: node} %>
<% end %> <!-- node -->
这是在我的 _comments
部分。
<% node.comments.each do |comment| %>
<li class="clearfix">
<a class="avatar" href="#">
<%= image_tag(comment.user.avatar.url)%>
所以看来解决方案是优化我的控制器调用,但是我不太确定该怎么做2级关联。我尝试过这个:
So it seems the solution is to optimize my controller call, but I am not quite sure how to do 2-levels of association. I tried this:
@nodes = @family_tree.nodes.includes(:comments).includes(:user)
但这似乎并没有摆脱N + 1查询问题。
But that doesn't seem to get rid of the N+1 query problem.
有什么想法吗?
推荐答案
您必须将哈希传递给包括
@nodes = @family_tree.nodes.includes(:comments => :user)
这篇关于如何在一次通话中渴望加载两个级别的关联?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!