2010-11-30 11 views
2

Ich habe zuvor eine Frage zur Strukturierung der Daten in einer einfachen App gestellt, die ich zur Verwaltung von Inhalten erstelle. Die Antwort war Single Table Inheritance und ich denke, es wird das Ticket sein.Wie wird das Feld: type in Single Table Inheritance aufgefüllt?

Ich habe ein paar Beispiele gelesen, aber eine Sache, die immer weggelassen wird, ist, wie die Spalte: type tatsächlich gefüllt ist? Umfasse ich ein Formularfeld mit einem Drop-Down-Menü, damit der Benutzer die Typen auswählen kann?

ich, dass ich voll und ganz verstehen glaube, wie STI arbeitet jetzt (das Typenfeld nimmt den Klassennamen), aber sind immer noch etwas sehr Grundlegendes fehlt (und wahrscheinlich auch sehr offensichtlich, aber ich vermisse es). Kann mich jemand ausfüllen?

Ich habe einen Tabelleninhalt in etwa so:

id 
type 
name 
desc 

und die verschiedenen Arten würden "Site", "Blog", "Foto" sein.

Antwort

6

Erraten, dass Sie alle "Site", "Blog", "Foto" Informationen in Inhalt Tabelle speichert. Wenn Sie ein Objekt mit Content.new initiieren, hat es dem Feld type keinen Wert zugewiesen.

Aber wenn Sie initiieren eine Klasse von „Site“, „Blog“ oder „Foto“, die von „Content“ -Modell tatsächlich geerbt wurde by- Site.new oder Site.create dann automatisch zuordnet es model_name (in diesem Fall- Site) in der Art Feld

In ähnlicher Weise, wenn Sie Blog.new tun wird es zuweisen Blog in Typ Spalte und so weiter.

+0

Im Wesentlichen das: Typ-Feld wird automatisch ausgefüllt, wenn Sie ein Objekt eines der * Unterklasse * speichern. Wenn Sie die Superklasse (Inhalt, in Ihrem Fall) speichern, dann sollte es unbesetzt bleiben, denke ich. –

+0

@Paul du bist auf dem richtigen Weg :-) –

1

@jyoseph, ja Sie sind absolut richtig. Sie können ein Drop-Down-Menü in Ihrer neuen und bearbeiteten Ansicht hinzufügen, in dem die Typen gespeichert sind, in Ihrem Fall "Site", "Blog", "Photo". Sie können auch einen Helfer in Ihrer Anwendung Helper-Datei machen als

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

folgt und dann in Ihrem Inhalt/new.html.erb Sie können

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

es versuchen, dies funktionieren könnte.

Nur für den Fall, wenn jemand will, um mehr über STI Besuch weiß my Blog

Verwandte Themen