将Rails多态性用于嵌套注释

我需要在Rails 3应用程序中构建一个嵌套的注释系统,该应用程序允许对许多模型(文章,post等)进行评论,并且正在讨论按照本文的内容编写我自己的解决方案。 有一些gem可供使用,例如使用awesome_nested_set的 acts_as_commentable_with_threading ,但是他们对我的需求感到臃肿。

  1. 我需要能够为多个模型添加注释
  2. 我需要能够无限深入地为评论添加评论
  3. 我需要能够有效地检索post,文章等的所有后代
  4. 我需要能够在适当的嵌套中有效地呈现注释

我的问题是,如果我能够解决我可能遇到的潜在问题。 我想避免走一条路只是为了走向死胡同。 我最初的担忧涉及有效地查询儿童。 比如说,获取一篇文章后代评论列表(儿童和儿童的孩子)。

有人对此有所了解吗? 谢谢。

您可以执行两种嵌套:树和嵌套集。

acts_as_tree只存储parent_id ,因此编写新条目的速度非常快,但您必须递归遍历id号链以获取所有子项的列表。 当您需要进行大量读取时,这不是一个好的选择。

awesome_nested_set记录三位信息: parent_idlftrgt 。 计算左右值,以便它们包含该条目的所有子ID。 这对于读取操作来说非常快,但写入速度较慢。

在你的情况下,我认为awesome_nested_set更合适。 您可能认为它看起来有点过分,但嵌套集很快就变得复杂了。 您需要使用嵌套集模式来有效地查询子项。

您只需要使用两种方法来呈现整个注释树:迭代Comment.roots并为每个注释渲染comment.children

 class ModelController < ApplicationController def show @model = Model.find_by_id(params[:id]) @comments = @model.comments.roots end end 
    <% @comments.each do |comment| %> <%= render :partial => 'comment', :object => comment %> <% end %>
  • <% if comment.children.present? %>
      <%= render :partial => 'comment', :collection => comment.children %>
    <% end %>
  • 要保存嵌套注释,只需填写parent_idawesome_nested_set将完成剩下的工作。 我不认为滚动你自己的解决方案会比这更优雅。

    更新 :看起来awesome_nested_set在一段时间内没有更新。 检查出祖先 。 基本上是一样的东西。

    树结构,是的,是一个好主意 – 但是它是查询执行本身是最关心的,我不认为大多数树实现作为一个gem考虑到这一点,虽然嵌套集是正常的 – 我想如果发生了一些非常糟糕的事情,它在写操作方面过于复杂。

    我会检查递归CTE – 虽然不是数据库不可知的,它为您提供了一个很好的数据结构,无需额外的属性来跟踪。

    我以前通过在评论表中添加以下字段来做类似的事情:

    attached_to_controller(string)

    attached_to_id(int)

    然后在显示时我将对注释索引进行AJAX调用并根据这两个字段进行过滤。

    当然,在创建注释时,您需要为这些字段传递适当的值。