首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从零开始嵌套注释

从零开始嵌套注释
EN

Stack Overflow用户
提问于 2014-03-25 13:23:59
回答 9查看 3.2K关注 0票数 12

假设我有一个评论模型:

代码语言:javascript
复制
class Comment < ActiveRecord::Base
    has_many :replies, class: "Comment", foreign_key: "reply_id"
end

我可以在这样的视图中显示评论实例的回复:

代码语言:javascript
复制
comment.replies do |reply|
   reply.content
end

然而,我如何循环通过答复的答复?它的回答呢?它的答复呢?我觉得我们需要通过类方法创建一个多维的答复数组,然后在视图中循环这个数组。

我不想用宝石,我想学习

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2014-03-28 10:00:29

似乎你所拥有的离你想要的只有一步之遥。您只需要使用递归为每个回复调用相同的代码,就像调用原始注释一样。例如。

代码语言:javascript
复制
<!-- 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活动记录时,都会运行另一个数据库查询。当然还有改进的余地,但这是基本的想法。

票数 9
EN

Stack Overflow用户

发布于 2014-03-28 04:19:03

使用嵌套集是否仍然可以算作“从头开始”?

嵌套集的简短描述是通过存储/查询前后顺序树遍历计数来查询层次结构的数据库特定策略。

一幅画胜过千言万语 (也见嵌套集上的wikipedia页面)。

有一堆嵌套的集宝石,我可以亲自代表可怕的嵌套集祖先的质量

然后,Awesome (我从经验中知道,大概也是祖先)提供了帮助来执行单个查询来提取树下的所有记录,并以排序的深度遍历树--首先,在您离开时传递级别。

Awesome嵌套集的视图代码如下所示:

代码语言:javascript
复制
<% Comment.each_with_level(@post.comments.self_and_descendants) do |comment, level| %>
  <div style="margin-left: <%= level * 50 %>px">
    <%= comment.body %>
    <%# etc %>
  </div>
<% end %>

我只是从模糊的记忆中编造出来的,已经有一段时间了,所以这就是“读者的练习”

票数 3
EN

Stack Overflow用户

发布于 2014-04-01 22:22:54

我的方法是尽可能有效地做到这一点。首先让我们讨论如何做到这一点:

  1. 干溶液。
  2. 检索注释的查询次数最少。

考虑到这一点,我发现大多数人都是以第一个而不是second.So为起点的。我们必须有部分评论,所以引用吉诺的答案

我们可以使用他的方法来显示评论,并在后面的答案中更新它。

代码语言:javascript
复制
<!-- 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中,因为它们没有任何评论(注意:如果有人有其他建议,请评论或编辑)

代码语言:javascript
复制
<!-- view -->
<div id="comments">
  <%= render partial: "comment", collection: @comments[nil] %>
</div>

每个注释的所有答复都将位于父注释id下的has中。

代码语言:javascript
复制
<!-- _comment partial -->
<div class="comment">
  <p><%= comment.content %></p>
  <%= render partial: "comment", collection: @comments[comment.id] %>
</div> 

要结束的

  1. 我们在注释模型中添加了一个object_id,以便能够检索它们(如果还没有)
  2. 我们通过reply_id添加了分组以检索带有一个查询的注释,并为视图处理它们。
  3. 我们添加了一个部分,它递归地显示注释(正如吉诺所提议的)。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22635981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档