Есть ли встроенная поддержка в Rails или Ruby для представления многопоточных комментариев?
Я хочу, чтобы в моем приложении был раздел комментариев, который выглядит следующим образом:
response1
response1a
response1b
response1b1
response2
response2a
response2b
response2c
response2c1
response2c1a
response2c1a1
response2c1a1
response2c1a1a
response2c1a1a1
Предполагая, что я делаю это с помощью HTML, например:
<div class="comment">
Response1
<div class="comment">
Response1a
<div class="comment">
Response1a1
</div>
</div>
<div class="comment">
Response1b
</div>
</div>
И этот CSS:
.comment { margin-left: 50px; }
До сих пор остается вопрос о структуре данных, которая будет использоваться в Rails для представления комментариев и их взаимосвязей друг с другом. Есть ли в Ruby встроенная поддержка для представления древовидной структуры данных, которая бы хорошо работала для этой структуры данных? Или мне нужно построить что-то настроенное для этой задачи?
5 ответов
Вы можете использовать один из плагинов вложенного набора - awesome_nested_set
кажется наиболее активно поддерживаемым. Это позволяет вам выбрать полный набор (включая всех потомков) с помощью одного вызова базы данных.
Возможно, вы захотите посмотреть в activ_as_tree что-то вроде этого.
class Post < ActiveRecord::Base
belongs_to :parent, :class_name => 'Post'
end
миграция:
create_table :posts do |t|
t.string :body
t.integer :parent_id
end
Вы можете попробовать использовать плагин http://github.com/elight/acts_as_commentable_with_threading/tree/master - он использует идеи Райана Бейтса (см. RailsCast о полиморфных ассоциациях) и awesome_nested_set
Я должен был реализовать такие вещи в Rails. Это не так уж сложно. Предложение Джо в значительной степени покрывает это. Ваш случай особенно прост, потому что вам не нужно беспокоиться о перемещении ветвей вашего дерева. Как только ответ добавляется в дерево ответов, он остается там, где он есть или (возможно) удаляется.
Я бы сказал, что для такой ситуации, реализовать ее самостоятельно было бы более практично, чем использовать гем или плагин.