0

我是 ruby​​ on rails 的新手,我需要建立一个 Post/Comment 关系,带有嵌套的评论,就像作者可以互相回复一样。

变成这样:

帖子/comments.html:

<% @post.comments.roots.each do |c| %>
  <%= nested_messages c.subtree.arrange(:order => :created_at) %>
<% end %>

这工作得很好,但显然需要大量查询来渲染一棵树,比如N+1,其中Ncomments.root.count

感谢帮助!

UPD: 带有 .includes() 的解决方案不适用于我的情况,但我不能 100% 确定我做的所有事情都是正确的......

对我有用的解决方案非常明显 - 通过指定 post_id 自行安排评论:

<%= nested_messages Comment.where('post_id = ?', @post.id).arrange(:order => :created_at) %>
4

4 回答 4

0

如果您的树结构如下所示:

Post
  comment (root1)
    comment (child11)
    comment (child12)
  comment(root2)
    comment (child21)
    comment (child22)
 ... and so on

将结构改造成这样可能会更好:

Post
  comment (meta root, only one, which holder other comments 'roots' and we never render this comment in the view)
    comment (child1)
      comment (child11
    comment (child2)
      comment (child21)
    comment (child3)
    ... and so on

现在将执行 2 个(或 3 个?)查询而不是 N+1

于 2013-08-06T11:16:59.753 回答
0

您应该使用include预先加载您的关联,这可以防止 N+1 查询。

http://guides.rubyonrails.org/active_record_querying.html#eager-loading-multiple-associations

于 2013-08-06T09:53:22.967 回答
0

带有 .includes() 的解决方案不适用于我的情况,但我不能 100% 确定我做的所有事情都是正确的......

对我有用的解决方案非常明显 - 通过指定 post_id 自行安排评论:

<%= nested_messages Comment.where('post_id = ?', @post.id).arrange(:order => :created_at) %>
于 2013-08-07T09:16:38.063 回答
0

您可以使用includes方法优化 N+1 问题

希望这适用于您的代码

@post.comments.roots.includes(:subtree)

我无能为力,arrange因为您没有指定您正在处理的版本

于 2013-08-06T10:37:25.620 回答