使用 Rails 多态性进行嵌套注释

2023-12-10

我需要在 Rails 3 应用程序中构建一个嵌套评论系统,允许对许多模型(文章、帖子等)进行评论,并且正在讨论按照以下方式滚动我自己的解决方案这个帖子。有可用的宝石,例如acts_as_commentable_with_threading with Awesome_nested_set,但他们对我的需求感到臃肿。

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

我的问题是,如果我推出自己的解决方案,我可能会面临哪些潜在的问题。我想避免走一条路只会到达死胡同。我最初的担忧与有效查询儿童有关。例如,获取文章后代评论(子项和子项的子项)的列表。

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


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

acts_as_tree只存储一个parent_id因此编写新条目确实很快,但是您必须递归地遍历 ID 号链才能获取所有子项的列表。当您需要进行大量阅读时,这不是一个好的选择。

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

要保存嵌套评论,只需填写parent_id and awesome_nested_set剩下的会做。我认为推出自己的解决方案不会比这更优雅。

Update: 看起来像awesome_nested_set有段时间没有更新了。查看ancestry反而。基本上做同样的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Rails 多态性进行嵌套注释 的相关文章

随机推荐