2009-07-23 17 views
1

Je veux avoir une section de commentaires dans mon application qui ressemble à ceci:Y at-il un support natif dans Rails ou Ruby pour représenter les commentaires filetés

response1 
response1a 
response1b 
    response1b1 
response2 
response2a 
response2b 
response2c 
    response2c1 
    response2c1a 
    response2c1a1 
    response2c1a1 
     response2c1a1a 
     response2c1a1a1 

En supposant que je le fais en utilisant HTML comme les suivants:

<div class="comment"> 
    Response1 
    <div class="comment"> 
    Response1a 
    <div class="comment"> 
     Response1a1 
    </div> 
    </div> 
    <div class="comment"> 
    Response1b 
    </div> 
</div> 

Et ce CSS:

.comment { margin-left: 50px; } 

Il reste la question de la structure de données à utiliser dans Rails représenter les commentaires et leurs relations les uns aux autres. Existe-t-il un support natif dans Ruby pour représenter une structure de données arborescente qui fonctionnerait bien pour cette structure de données? Ou aurais-je besoin de construire quelque chose de personnalisé pour cette tâche?

Répondre

4

Vous pouvez utiliser l'un des plugins d'ensemble imbriqués - awesome_nested_set semble être le plus activement maintenu. Ceux-ci vous permettent de sélectionner un ensemble complet (y compris tous les descendants) avec un seul appel à la base de données.

+0

Je l'ai édité pour corriger le lien - je ne sais pas pourquoi cela n'a pas fonctionné en premier lieu. –

2
class Post < ActiveRecord::Base 
    belongs_to :parent, :class_name => 'Post' 
end 

migration:

create_table :posts do |t| 
    t.string :body 
    t.integer :parent_id 
end 
3

Vous pouvez regarder dans acts_as_tree pour quelque chose comme ça.

+0

awesome_nested_set est supérieure. Tout commence par un [bon schéma pour les données hiérarchiques] (http://dev.mysql.com/tech-resources/articles/hierarchical-data.html). –

1

J'ai dû implémenter des choses comme ça dans Rails. Ce n'est pas trop difficile. La suggestion de Joe couvre à peu près tout. Votre cas est particulièrement facile car vous n'avez pas à vous soucier de déplacer les branches de votre arbre. Une fois qu'une réponse est ajoutée à l'arbre des réponses, elle reste là où elle est ou (peut-être) est supprimée.

Je dirais que dans une situation comme celle-ci, l'implémenter soi-même serait plus pratique que d'utiliser un gem ou un plugin.