如何在1次呼叫中急切加载两级关联?
我有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
Node
class Node < ActiveRecord::Base belongs_to :family_tree belongs_to :user has_many :comments, dependent: :destroy end
Comment
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
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
在我使用它的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
当我尝试使用Bullet gem优化我的应用程序时,我收到以下消息:
N+1 Query detected Comment => [:user] Add to your finder: :include => [:user] N+1 Query method call stack
我的_comments
部分产生这个N + 1问题被称为这样 – 在我的views/dashboard/index.html.erb
:
这是在我的_comments
partial中围绕这些行发生n + 1个违规查询的_comments
。
因此,似乎解决方案是优化我的控制器调用,但我不太确定如何进行2级关联。 我试过这个:
@nodes = @family_tree.nodes.includes(:comments).includes(:user)
但这似乎并没有摆脱N + 1查询问题。
有任何想法吗?
您必须将哈希传递给includes
@nodes = @family_tree.nodes.includes(:comments => :user)