假设我有一个评论模型:
class Comment < ActiveRecord::Base
has_many :replies, class: "Comment", foreign_key: "reply_id"
end我可以在这样的视图中显示评论实例的回复:
comment.replies do |reply|
reply.content
end然而,我如何循环通过答复的答复?它的回答呢?它的答复呢?我觉得我们需要通过类方法创建一个多维的答复数组,然后在视图中循环这个数组。
我不想用宝石,我想学习
发布于 2014-03-28 10:00:29
似乎你所拥有的离你想要的只有一步之遥。您只需要使用递归为每个回复调用相同的代码,就像调用原始注释一样。例如。
<!-- view -->
<div id="comments">
<%= render partial: "comment", collection: @comments %>
</div>
<!-- _comment partial -->
<div class="comment">
<p><%= comment.content %></p>
<%= render partial: "comment", collection: comment.replies %>
</div>注:这不是最有效的做事方法。每次调用comment.replies活动记录时,都会运行另一个数据库查询。当然还有改进的余地,但这是基本的想法。
发布于 2014-03-28 04:19:03
使用嵌套集是否仍然可以算作“从头开始”?
嵌套集的简短描述是通过存储/查询前后顺序树遍历计数来查询层次结构的数据库特定策略。
一幅画胜过千言万语 (也见嵌套集上的wikipedia页面)。
然后,Awesome (我从经验中知道,大概也是祖先)提供了帮助来执行单个查询来提取树下的所有记录,并以排序的深度遍历树--首先,在您离开时传递级别。
Awesome嵌套集的视图代码如下所示:
<% Comment.each_with_level(@post.comments.self_and_descendants) do |comment, level| %>
<div style="margin-left: <%= level * 50 %>px">
<%= comment.body %>
<%# etc %>
</div>
<% end %>我只是从模糊的记忆中编造出来的,已经有一段时间了,所以这就是“读者的练习”
发布于 2014-04-01 22:22:54
我的方法是尽可能有效地做到这一点。首先让我们讨论如何做到这一点:
考虑到这一点,我发现大多数人都是以第一个而不是second.So为起点的。我们必须有部分评论,所以引用吉诺的答案
我们可以使用他的方法来显示评论,并在后面的答案中更新它。
<!-- view -->
<div id="comments">
<%= render partial: "comment", collection: @comments %>
</div>
<!-- _comment partial -->
<div class="comment">
<p><%= comment.content %></p>
<%= render partial: "comment", collection: comment.replies %>
</div> 如果可能的话,我们现在必须在一个查询中检索这些注释,这样我们就可以在控制器中这样做了。为了能够做到这一点,所有的注释和回复都应该有一个commentable_id (并且输入如果多态),这样当我们查询时,我们可以得到所有的注释,然后按照我们想要的方式对它们进行分组。
因此,如果我们有一个帖子,例如,我们想得到它的所有意见,我们会在控制器上说。@comments = @post.comments.group_by {comments= c.reply_id}
这样,我们就可以在一个查询中直接显示注释了,现在我们可以这样做来显示它们,而不是以前所做的。
所有不是回复的评论现在都出现在@ reply_id中,因为它们没有任何评论(注意:如果有人有其他建议,请评论或编辑)
<!-- view -->
<div id="comments">
<%= render partial: "comment", collection: @comments[nil] %>
</div>每个注释的所有答复都将位于父注释id下的has中。
<!-- _comment partial -->
<div class="comment">
<p><%= comment.content %></p>
<%= render partial: "comment", collection: @comments[comment.id] %>
</div> 要结束的:
https://stackoverflow.com/questions/22635981
复制相似问题