首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套集合模型中的急切加载关联

问嵌套集合模型中的急切加载关联
EN

Stack Overflow用户
提问于 2015-04-02 00:34:30
回答 1查看 289关注 0票数 2

我使用嵌套set来表示嵌套评论(1个讨论,其中有许多评论,评论可以回复),我希望(如果可能)急于加载评论的答案。

此时,我加载所有根节点并遍历它们,如果它们有子代,我会渲染它们。但是,如果有很多具有答案的根节点,则会触发大量的DB请求。

评论包含以下列:rgt, lft, parent_id

我试着建立这样的关系:

代码语言:javascript
复制
class Comment < ActiveRecord::Base
  has_many :answers, -> (node) { where("lft > ? AND rgt < ?", node.lft, node.rgt) }, class_name: "Comment", foreign_key: :parent_id
end

当在comment实例上调用时,这将获取评论的答案。但是,如果我尝试eager_load it (Discussion.comments.includes(:answers)),它会失败,因为node为零。

是否有可能立即加载类似这样的内容?

EN

回答 1

Stack Overflow用户

发布于 2015-04-02 03:06:38

我想,我找到了一个解决方案。如果我没看错的话,您的数据模型如下所示:

代码语言:javascript
复制
Discussion
----------
...

Comment
----------
discussion_id:int
parent_id:int
lft:int
rgt:int

则AR模型类将为:

代码语言:javascript
复制
class Discussion < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :discussion
end

要立即加载讨论(id == 1)及其所有评论和答案树,请使用:

代码语言:javascript
复制
d = Discussion.includes(:comments).find(1)

它在内存(d.comments)中给出了给定讨论的所有注释的集合。

现在我们可以操作这个集合来获得任何特定评论的答案,而不需要额外的DB查询。只需将此代码添加到Discussion类:

代码语言:javascript
复制
def comment_roots
  self.comments.select {|c| c.parent_id.nil? }
end

这是Comment类的代码:

代码语言:javascript
复制
  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

示例:

代码语言:javascript
复制
d.comment_roots.first.answers
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29396150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档