祖先,has_many_roots?

时间:2013-08-06 09:38:16

标签: ruby-on-rails ruby nested-loops

我是ruby on rails的新手,我需要建立一个Post / Comment关系,使用嵌套的注释,就像作者可以互相回复一样。

像这样:

交/ comments.html:

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

这很好用,但显然需要很多查询来渲染树,比如 N + 1 ,其中 N comments.root.count

感谢您的帮助!

UPD: 使用.includes()的Soluton对我的情况不起作用,但我并不是100%确定我正在做所有事情......

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

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

4 个答案:

答案 0 :(得分:0)

您应该使用include急切加载关联,这可以防止N + 1次查询。

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

答案 1 :(得分:0)

您可以使用includes方法

优化N + 1问题

希望这适用于您的代码

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

我无法帮助arrange,因为你没有指定你正在处理的版本

答案 2 :(得分: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

答案 3 :(得分:0)

使用.includes()的Soluton对我的情况不起作用,但我并不是100%确定我正在做所有事情......

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

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