2010-06-19 8 views
0

J'ai trois modèles: paste, snippet et tutorial. Je veux montrer le plus récent de tous mélangés dans une liste, comme celui-ci sur la page:Mélange de différents modèles dans une liste dans une vue

<ul> 
<li>Just a paste</li> 
<li>The worst snippet ever (-10202343 kudos) (1 quadrillion comments)</li> 
<li>Just another paste</li> 
<li>Ruby on Rails tutorial (5 kudos) (2 comments)</li> 
<li>Another snippet</li> 
</ul> 

triés par date. Le problème est que je veux mélanger ces trois modèles dans une liste. Tous les modèles ont des attributs spécifiques (par exemple snippet et tutorial ont des étiquettes, tous ont des titres, tutorial s et snippet s ont des kudos, seulement paste a un booléen privé (donc il ne devrait pas être listé)).

Comment puis-je faire une sorte de mélange de ces différents modèles à mon avis? Merci

Répondre

3

Je résoudrais cela au niveau de la base de données, en introduisant un élément PublishedItem, et le paramètre PublishedItem pointe alors vers un Coller, un Extrait ou un Tutoriel. Cela résoudrait la création de la liste des articles: il suffit de sélectionner les 5 derniers articles publiés. Et à partir d'un article publié, vous pouvez alors trouver l'article correct, et le montrer.

+2

Je suis absolument d'accord que cela devrait être fait au niveau de la base de données, mais suggérez-vous que le PublishedItem devrait avoir sa propre table? C'est juste faux! Cela introduirait toutes sortes de problèmes. Au lieu de cela, créez une vue de base de données en sélectionnant toutes les colonnes communes de chaque modèle. Laissez ensuite le PublishedItem utiliser la vue au lieu d'une table. Créez également une association polymorphe entre PublishedItem et les autres modèles. Mais ne le faites pas manuellement, laissez le bijou listable faire tout le mal. – Johannes

+1

Une vue est en effet un moyen de résoudre ce problème. L'héritage de table unique est le chemin de rails généralement conseillé, mais cela peut parfois introduire d'autres problèmes si les objets ont des attributs très différents. Donc je crois toujours qu'une bonne alternative est Multiple Table Héritage, qui à mon avis, n'est pas juste injuste. Un bon article sur peut être trouvé [ici] (http://techspry.com/ruby_and_rails/multiple-table-inheritance-in-rails-3/). HTH. Notez s'il vous plaît que ce n'est pas un nouveau concept, j'ai utilisé cette approche de nombreux éléments en dehors des rails. – nathanvda

+0

Eh bien, bien sûr, si les modèles sont liés, MTI est une très bonne solution. Absolument rien de mal avec ça! Mais si vous voulez montrer des modèles complètement indépendants dans une liste mixte, l'approche de vue a beaucoup plus de sens. – Johannes

1

Faire une liste des « événements » ou autre dans votre contrôleur

@events = Paste.find_all 
@events << Snippet.find(:order => "votes", :limit => 1) 
@events << Tutorial.find_all 

alors dans votre vue

<% 
    @events.each do |event| 
     display_snippet(event) if event.class == Snippet 
     display_tutorial(event) if event.class == Tutorial 
    end 
%> 

il y a quelques façons de gérer la partie de vue de celui-ci, mais il semble assez simple. Dans cet exemple, display_snippet et display_event seraient des méthodes auxiliaires mais il pourrait être plus propre à utiliser les partiels.

+0

qui est bien trop logique dans la vue –

+0

Je ne vois que les extraits:/ –

+0

Matt, il est juste une boucle et deux instructions if pour contrôler l'affichage ..... Que proposeriez-vous? –

Questions connexes