2016-06-29 19 views
0

Ich habe ein User Modell mit einer darunter liegenden type Spalt, die Single Table Inheritance implementieren für Kindermodelle Teacher und Student und so weiter wie erwartet funktioniert.Ich mag das Typ-Feld von meinem STI Modell

Ich habe einen entsprechenden Rails Controller, der User.find ruft, um einzelne Datensätze zu ziehen und wieder, STI funktioniert großartig. Ich bekomme richtig typisierte Modellobjekte mit den richtigen Daten in ihnen. Das Feld type wird von den aus meinen Datenbankzeilen extrahierten Werten ausgeschlossen. Ich möchte, dass in den Ergebnissen der User.find aufgenommen werden, damit meine Daten sieht etwa so aus:

{ id: 3, name: "Jane Doe", type: "Student" }, 
{ id: 7, name: "Jane Clark", type: "Teacher" } 

ich, warum dies nicht der Standard ist: die meiste Zeit die Klasse oder den Typ des eigentlichen Objekts ist der beste Art und Weise zu kommunizieren, welche Art von User Sie betrachten. Aber für meine Zwecke geht die Typinformation in der JSON-Übersetzung verloren und ich möchte sie lieber in dieser wörtlichen Form senden, da ich sie direkt in der Verbraucheranwendung verwende.

Daher meine Frage ist: Was hält die type Feld aus der Ausgabe von User.find? Was kann ich tun, um das zu überschreiben, idealerweise in einer Weise, die type nur ein anderes gewöhnliches Datenfeld zu sein scheint?

Antwort

0

Hier ist ein Workaround, der für jetzt in Ordnung ist.

Die Problemumgehung besteht darin, den literalen Typ anhand eines Namens oder anderer typspezifischer Informationen, die Sie weitergeben möchten, in einem öffentlichen Attribut in allen untergeordneten Modellen zu speichern. Z. B.

def classProperty 
    'Student' 
end 

Für meine Zwecke ist es gut genug, um diese Informationen in der anrufenden Controller abzurufen und gewöhnliche Ruby-Datenverarbeitung Code verwenden es in der JSONized Antwort einzufügen.

Ich bin immer noch neugierig, über den Mechanismus, mit dem die type Spalte nicht in meinen Modellen angezeigt wird und wie es in Fällen wie diesem überwunden werden könnte.