Есть ли лучший подход для отображения записей о детях и внуках?

Мне нужно собрать всех авторов в дереве, как:

parent
|
+- child #1
|
+- child #1
|  |
|  +- grand child #1
|  |
|  +- grand child #2
|
+- child #2
...

(Исходная запись может иметь n дочерних элементов, и у каждого ребенка также может быть m дочерних элементов. Максимальная глубина от исходной записи равна 2: Post - Child - Grandchild)

Каков наилучший подход в Ruby on Rails для сбора всех авторов (пост принадлежит автору)? Мой текущий подход заключается в следующем, но, похоже, он не очень эффективен:

def all_authors_in(post)
  @authors = Array.new
  @authors << post.author

  post.children.each do |child|
    @authors << child.author
    child.children.each do |grandchild| 
      @authors << grandchild.author
    end
  end

  @authors.map{|u| u.id}.uniq
end

Немного кода из модели:

class Post < ActiveRecord::Base
  belongs_to :parent, class_name: 'Post'
  has_many :children, foreign_key: :parent_id, class_name: 'Post', :dependent => :destroy
#...
end

Спасибо

1 ответ

Решение

Я предполагаю, что вы используете наследование одной таблицы для вашего Post модель, но вы не сказали, если вы катали свою собственную версию. Я бы порекомендовал использовать драгоценный камень предков. Тогда вы можете сделать что-то простое, как это:

@authors = post.subtree.collect(&:author).uniq
Другие вопросы по тегам