Существует два вида вложений: дерево и вложенный набор.
acts_as_tree
хранит только parent_id
, поэтому писать новые записи очень быстро, но вы должны рекурсивно пройтись по цепочке идентификаторов, чтобы получить список всех дочерних элементов. Это не хороший выбор, когда вам нужно много читать.
awesome_nested_set
записывает три бита информации: parent_id
, lft
и rgt
. Левые и правые значения рассчитываются так, чтобы они содержали все дочерние идентификаторы для этой записи. Это очень быстро для операций чтения, но медленнее для записи.
В вашем случае я думаю awesome_nested_set
более уместно. Вы можете подумать, что это кажется излишним, но вложенные множества усложняются в спешке. Вам необходимо использовать шаблон вложенного набора для эффективного запроса дочерних элементов.
Вам нужно использовать только два метода для рендеринга всего дерева комментариев: итерировать по Comment.roots
и для каждого комментария визуализировать comment.children
.
class ModelController < ApplicationController
def show
@model = Model.find_by_id(params[:id])
@comments = @model.comments.roots
end
end
<ul id="comments">
<% @comments.each do |comment| %>
<%= render :partial => 'comment', :object => comment %>
<% end %>
</ul>
<!-- _comment partial -->
<li class="comment">
<!-- comment markup -->
<% if comment.children.present? %>
<ul>
<%= render :partial => 'comment', :collection => comment.children %>
</ul>
<% end %>
</li>
Чтобы сохранить вложенный комментарий, просто заполните parent_id
, а awesome_nested_set
сделает все остальное. Я не думаю, что накатить ваше собственное решение будет более элегантно, чем это.
Обновление : Похоже, awesome_nested_set
не обновлялось некоторое время. Проверьте родословную вместо этого. В основном делает то же самое.