如何在一次通话中渴望加载两个级别的关联? [英] How do I eager load two levels of associations in 1 call?

查看:94
本文介绍了如何在一次通话中渴望加载两个级别的关联?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆