2016-04-26 20 views
3

Say in meinem Schema I mit einem Attributfeld von Haustieren eine Benutzer-Tabelle hat, den Standard ist auf [ "dogs"]:Standardwerte für Child-Klasse Attribute in Rails

create_table "users", force: true do |t| 
    ... 
    t.text "pets",  default: ["dogs"], array: true 
    ... 

Ich habe ein Modell FriendlyUser, die erbt aus Klasse User: class FriendlyUser < User

Wenn also ein FriendlyUser erstellt wird, ist der Typ "FriendlyUser". Aber ich mag FriendlyUser Haustiere auf einen Standard von Hunden und Katzen gesetzt haben: [ „Hunde“, „Katzen“]

Ist dies möglich, mit einer Migration oder muss dies in der Klasse durchgeführt werden (durch ein initialize zwingenden Methode, mit after_initialize, before_create, etc)?

Antwort

1

Standardwerte in Rails-Migrationen sind nicht dafür vorgesehen, Logik wie diese zu behandeln. Von der Datenbankseite aus könnte es technisch möglich sein, einen Trigger zu verwenden, um die Daten beim Einfügen basierend auf dem Wert in der Spalte type zu füllen, aber das ist wahrscheinlich mehr Mühe und Komplikation als es wert ist.

Die Einstellung des Werts in einem before_validation Rückruf ist wahrscheinlich Ihre beste Wette. Und da Sie Vererbung verwenden, können Sie den Rückruf in der Unterklasse überschreiben.

1

Da STI eine Tabelle für mehrere Modelle verwendet, wird es durch Standardwerte in der Datenbankschicht für Ihre Modelle schwieriger, unterschiedliche Merkmale zu haben. Daher sollten Sie die Standardwertlogik an Ihre Anwendungslogik anpassen, wo Sie modellspezifisches Verhalten definieren können.

Verwandte Themen