我需要在 Rails 3 应用程序中构建一个嵌套评论系统,允许对许多模型(文章、帖子等)进行评论,并且正在讨论按照以下方式滚动我自己的解决方案这个帖子。有可用的宝石,例如acts_as_commentable_with_threading with Awesome_nested_set,但他们对我的需求感到臃肿。
- 我需要能够向多个模型添加评论
- 我需要能够在评论中添加评论,无限深
- 我需要能够有效地检索帖子、文章等的所有后代
- 我需要能够在适当的嵌套中有效地呈现评论
我的问题是,如果我推出自己的解决方案,我可能会面临哪些潜在的问题。我想避免走一条路只会到达死胡同。我最初的担忧与有效查询儿童有关。例如,获取文章后代评论(子项和子项的子项)的列表。
有人对此有意见吗?谢谢。
您可以执行两种嵌套:树和嵌套集。
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(使用前将#替换为@)