2 votes

Existe-t-il une meilleure approche pour cartographier les enregistrements des enfants et des petits-enfants ?

J'ai besoin de rassembler tous les auteurs dans un arbre :

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

(Le poste d'origine peut avoir n enfants et chaque enfant peut également avoir m enfants. La profondeur maximale à partir du poste d'origine est de 2 : poste - enfant - petit-enfant).

Quelle est la meilleure approche en Ruby on Rails pour collecter tous les auteurs (post belongs_to author) ? Mon approche actuelle est la suivante, mais elle ne semble pas vraiment performante :

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

Un peu de code du modèle :

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

Remerciements

1voto

Thilo Points 10034

Je suppose que vous utilisez l'héritage d'une seule table pour votre Post mais vous n'avez pas dit si vous aviez roulé votre propre version. Je recommanderais d'utiliser le modèle gemme d'ascendance . Vous pourriez alors faire quelque chose de simple comme ceci :

@authors = post.subtree.collect(&:author).uniq

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X