Есть ли встроенная поддержка в 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. Это не так уж сложно. Предложение Джо в значительной степени покрывает это. Ваш случай особенно прост, потому что вам не нужно беспокоиться о перемещении ветвей вашего дерева. Как только ответ добавляется в дерево ответов, он остается там, где он есть или (возможно) удаляется.

Я бы сказал, что для такой ситуации, реализовать ее самостоятельно было бы более практично, чем использовать гем или плагин.

Другие вопросы по тегам