2013-08-06 2 views
0

Я новичок в рубинах на рельсах, и мне нужно сделать связь Post/Comment с вложенными комментариями, например, авторами можно ответить друг другу.Ancestry, has_many_roots?

Сделано это следующим образом:

пост/comments.html:

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

Это работает довольно хорошо, но, очевидно, нуждается в большом количестве запросов, чтобы сделать дерево, как N + 1, где N - comments.root.count.

Спасибо за помощь!

UPD: Soluton с .includes() не работает в моем случае, но я не 100% уверен, что я делаю все вещи правильно ...

Решение работало для меня было довольно очевидно - устроить комментарии сам себе, указав pOST_ID:

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

ответ

0

Вы можете оптимизировать N +-проблему с использованием includes методом

Надеется, что это работает для вашего кода

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

Я не мог помочь с arrange, потому что вы не определили версию, имеют дело с

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 запросов вместо N + 1

0

Soluton с .includes() (или 3?) не работал на мой случай, но я не уверен на 100%, что я все правильно делал ...

Решение для меня было довольно очевидным - чтобы упорядочить комментарии самостоятельно, указав post_id:

<%= nested_messages Comment.where('post_id = ?', @post.id).arrange(:order => :created_at) %> 
Смежные вопросы