将Rails多态用于嵌套注释

Eri*_* M. 2 polymorphism comments nested ruby-on-rails

我需要在Rails 3应用程序,它允许在许多模型(文章,帖子等)和我辩论轧制线沿线的我自己的解决方案的意见建立一个嵌套评论系统这篇文章.有一些宝石可供使用,例如使用awesome_nested_set的acts_as_commentable_with_threading,但是他们对我的需求感到臃肿.

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

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

有人对此有意见吗?谢谢.

Ada*_*sek 6

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

acts_as_tree只存储一个parent_id,所以写新条目真的很快,但是你必须递归地遍历id号链以获得所有孩子的列表.当您需要进行大量读取时,这不是一个好的选择.

awesome_nested_set记录的信息三位:parent_id,lftrgt.计算左右值,以便它们包含该条目的所有子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

<ul id="comments">
<% @comments.each do |comment| %>
  <%= render :partial => 'comment', :object => comment %>
<% end %>
</ul>

<!-- _comment partial -->
<li class="comment">
  <!-- comment markup -->
  <% if comment.children.present? %>
  <ul>
    <%= render :partial => 'comment', :collection => comment.children %>
  </ul>
  <% end %>
</li>
Run Code Online (Sandbox Code Playgroud)

要保存嵌套注释,只需填写parent_idawesome_nested_set执行其余操作即可.我不认为滚动你自己的解决方案会比这更优雅.

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