allererst als Jonathan Allard sagte der from
und to
sind nicht in der Methode Quelle verwenden müssen, was bedeutet, dass die change_column_default
akzeptiert es nicht. Es ist einfach so:
def sum(a)
return a
end
Nun, wenn Sie versuchen, zwei Variablen, um es passieren wie sum(a, b)
oder irgendetwas wird es dieses Recht nicht akzeptieren. Dies versuchen Sie oben unter Verwendung von from
und to
.
Nun ist die korrekte Syntax hierfür ist:
change_column_default(:people, :height, 0)
Verfahren nicht from
und to
nicht akzeptiert (wie sie als solche definiert ist, auch wenn sie Hash-Schlüssel sind, wenn die Methode nicht Gebrauch macht das Schlüsselwertpaar irgendwo, dann nützt es nichts, und wenn es eine neue Spalte ist, hat es offensichtlich den Standardwert nil
(wenn nicht vorher gesetzt) und nehme an, ob die Spalte height
if vom Typ integer
ist und du gibst es als Standard an Wert a
wird es 0
als Standardwert (nicht 100% sicher, aber habe versucht, dies von Rails-Konsole zu tun). Es ist für Schienen nicht wichtig, was der Standardwert ist, es braucht nur den neuen Standardwert. Wenn also der aktuelle Standardwert 0
ist und Sie ihn auf nil
einstellen, wird dies nicht beanstandet. Es ist Ihre Datenbank und Sie möchten, was damit zu tun ist. Nur wenn die Datenbank es unterbricht, wenn Sie etwas falsch machen, wie das Zuweisen string
zu boolean
dann wird es offensichtlich Fehler werfen.
Jetzt, nachdem diese Migration ausgeführt wurde, wird jetzt der Standardwert auf 0
gesetzt. Rails weiß nicht, was der vorherige Standardwert war. Wie es weg ist und es nirgends gespeichert hat. Deshalb ist change_column_default
eine irreversible Migration. Und wenn Sie versuchen, es zurückzurollen, gibt es im Fall von change
Methode. Bedeutet, wenn Sie verwendet haben:
def change
change_column_default(:people, :height, 0)
end
So deshalb für diese Art von Migrationen wir die Methode up
und down
verwenden:
def up
change_column_default(:people, :height, 0)
end
def down
change_column_default(:people, :height, nil)
end
Hoffnung, das hilft.
Könnte es sein, dass Rails versucht, eine Art Zwangsproblem zu vermeiden? – max
http://stackoverflow.com/questions/7098602/add-a-default-value-to-a-column-through-a-migration – max
Ich sehe keine 'from' oder' to' Parameter in der [Methodendefinition] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionA) dapters/PostgreSQL/SchemaStatements.html # method-i-change_column_default) –