Ruby on rails 嵌套集模型中的急负荷关联

Ruby on rails 嵌套集模型中的急负荷关联,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我使用嵌套集来表示嵌套注释(1个讨论,其中有许多注释,可以回复注释),我希望(如果可能的话)将答案加载到注释中 此时,我加载所有根节点并对它们进行迭代,如果它们有后代,我将渲染它们。但是,如果有许多根节点具有应答,则会触发许多DB请求 注释包含以下列: rgt、lft、家长id 我试图建立这样的关系: class Comment < ActiveRecord::Base has_many :answers, -> (node) { where("lft > ? AND rg

我使用嵌套集来表示嵌套注释(1个讨论,其中有许多注释,可以回复注释),我希望(如果可能的话)将答案加载到注释中

此时,我加载所有根节点并对它们进行迭代,如果它们有后代,我将渲染它们。但是,如果有许多根节点具有应答,则会触发许多DB请求

注释包含以下列:
rgt、lft、家长id

我试图建立这样的关系:

class Comment < ActiveRecord::Base
  has_many :answers, -> (node) { where("lft > ? AND rgt < ?", node.lft, node.rgt) }, class_name: "Comment", foreign_key: :parent_id
end
Discussion
----------
...

Comment
----------
discussion_id:int
parent_id:int
lft:int
rgt:int
class注释(node){where(“lft>”和rgt<?”,node.lft,node.rgt)},类名:“Comment”,外键::父id
结束
这将在对注释实例调用时获取注释的答案。但是,如果我尝试加载它(
Discussion.comments.includes(:answers)
),它会崩溃,因为
节点
为零


有可能加载这样的内容吗?

我想,我已经找到了解决方案。 如果我看对了,您的数据模型如下所示:

class Comment < ActiveRecord::Base
  has_many :answers, -> (node) { where("lft > ? AND rgt < ?", node.lft, node.rgt) }, class_name: "Comment", foreign_key: :parent_id
end
Discussion
----------
...

Comment
----------
discussion_id:int
parent_id:int
lft:int
rgt:int
那么AR模型类将是:

class Discussion < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :discussion
end
这将为内存中给定的讨论提供所有注释的集合(
d.comments

现在,我们可以操纵这个集合来获取任何特定注释的答案,而无需额外的DB查询。只需将此添加到
讨论
课堂:

def comment_roots
  self.comments.select {|c| c.parent_id.nil? }
end
  def answers
    self.discussion.comments.select {|c| c.parent_id = self.id }
  end

  def answers_tree
    self.discussion.comments.select {|c| self.lft < c.lft && c.rgt <   self.rgt }
  end
这是给
注释
类的:

def comment_roots
  self.comments.select {|c| c.parent_id.nil? }
end
  def answers
    self.discussion.comments.select {|c| c.parent_id = self.id }
  end

  def answers_tree
    self.discussion.comments.select {|c| self.lft < c.lft && c.rgt <   self.rgt }
  end

什么是
节点
?什么是“所有根节点”?为什么你的
中有很多:答案
中有
类名:“Comment”
?我猜他心目中的答案和评论有一个共同的模式。只是一个不同的名字PA评论属于讨论(其实并不重要)。一条评论有许多答案(回复),这些答案也是评论。根节点是一个注释,它不是对另一个注释(parent_id=nil)的回答(reply)。很抱歉,我错过了关于使用嵌套集(可能应该在标题中:)的部分。您是否使用嵌套集gem?@smathy是的,感谢您编辑标题。是的,我使用的是很棒的嵌套集gem,它们不支持快速加载子体。这里有一个问题我已经在那里打开: