2010-11-30 20 views
2

J'ai posé une question plus tôt sur la façon de structurer les données dans une application simple que je construis pour gérer le contenu. La réponse était de regarder Single Table Inheritance et je pense que ça va être le billet.Comment le champ: type est-il renseigné dans l'héritage de table unique?

J'ai lu pas mal d'exemples mais une chose qui semble toujours être laissée de côté est comment la colonne: type est réellement remplie? Dois-je inclure un champ de formulaire avec une liste déroulante afin que l'utilisateur puisse sélectionner les types?

Je crois que je comprends parfaitement comment STI fonctionne maintenant (le champ type prend le nom de la classe) mais il me manque encore quelque chose de très basique (et probablement très évident, mais il me manque). Quelqu'un peut-il me remplir?

J'ai une table de contenu comme ceci:

id 
type 
name 
desc 

Et les différents types serait "Site", "blog", "Photo".

Répondre

6

En supposant que vous stocke toutes les informations "Site", "Blog", "Photo" dans contenu table. Lorsque vous initie un objet par Content.new, aucune valeur n'a été affectée à un champ de type.

Mais si vous lancez une classe de « site », « Blog » ou « Photo » qui ont été effectivement hérité de modèle « Contenu » sous- Site.new ou Site.create il attribue automatiquement MODEL_NAME (dans ce crémerie- Site) dans le domaine du type

de même, si vous Blog.new il assignera Blog dans la colonne de type et ainsi de suite.

+0

Essentiellement, le champ de type est rempli automatiquement lorsque vous enregistrez un objet de l'un des sous-classe * *. Si vous enregistrez la superclasse (contenu, dans votre cas) alors il devrait rester non peuplé je pense. –

+0

@Paul vous êtes sur la bonne voie :-) –

1

@josef, oui vous avez absolument raison. Vous pouvez ajouter une liste déroulante dans votre nouvelle vue et modifier celle qui contiendra les types, dans votre cas "Site", "Blog", "Photo". Vous pouvez également faire une aide dans votre fichier d'aide de l'application comme suit

def content_type 
    return ["Site", "Blog", "Photo"] 
end 

puis dans le contenu de votre/new.html.erb vous pouvez faire

<p> 
    <%= f.label :type %><br /> 
    <%= f.select :type, content_type %> 
</p> 

essayer, cela pourrait fonctionner.

Juste au cas où si quelqu'un veut en savoir plus sur la visite des IST my Blog