Ich habe in einer früheren Migration eine Datumsspalte erstellt und diese auf null gesetzt. Jetzt möchte ich es so ändern, dass es nicht nullbar ist. Wie gehe ich vor, wenn diese Datenbank Nullzeilen enthält? Ich kann diese Spalten auf Time.now setzen, wenn sie derzeit null sind.
ruby-on-rails
migration
Kevin Pang
quelle
quelle
MyModel.update_all({:date_column => Time.now}, {:date_column => nil})
. Die Abfrage in Ihrem ursprünglichen Formular hat gerade dazu geführt, dass alle meine Modelle im Feld keinen Wert haben.change
Methode ist für diesen Fall nicht so geeignet, da (1) dieupdate_all
Methode sowohl bei der Migration als auch bei einer möglichen Wiederherstellung ausgeführt wird. Das ist vielleicht nicht das Schlimmste, aber weil (2) die Migration keine Möglichkeit hat zu wissen, gegenüber was die Spalte bei einem möglichen Zurücksetzen geändert wurde. Also für diesen Fall würde ich beiup
und bleibendown
.In Rails 4 ist dies eine bessere (DRYer) Lösung:
Um sicherzustellen, dass keine Datensätze mit
NULL
Werten in dieser Spalte vorhanden sind, können Sie einen vierten Parameter übergeben. Dies ist der Standardwert, der für Datensätze mitNULL
Werten verwendet wird:quelle
change_column_null
. Der obige Kommentar von Rick Smith weist jedoch auf einen sehr gültigen Fall hin.Schienen 4 (andere Antworten auf Schienen 4 haben Probleme):
Das Ändern einer Spalte mit NULL-Werten, um NULL nicht zuzulassen, führt zu Problemen. Dies ist genau die Art von Code, die in Ihrem Entwicklungssetup einwandfrei funktioniert und dann abstürzt, wenn Sie versuchen, ihn in Ihrer LIVE- Produktion bereitzustellen . Sie sollten zuerst NULL-Werte in etwas Gültiges ändern und dann NULL-Werte nicht zulassen. Der 4. Wert in
change_column_null
macht genau das. Weitere Informationen finden Sie in der Dokumentation .Außerdem ziehe ich es im Allgemeinen vor, einen Standardwert für das Feld festzulegen, damit ich den Wert des Felds nicht jedes Mal angeben muss, wenn ich ein neues Objekt erstelle. Dazu habe ich auch den auskommentierten Code eingefügt.
quelle
add_column :users, :admin, :string
thenchange_column_null(:admin, :string, false, "new_value_for_existing_records")
Erstellen Sie eine Migration mit einer
change_column
Anweisung mit einem:default =>
Wert.Siehe: change_column
Abhängig vom Datenbankmodul müssen Sie möglicherweise verwenden
change_column_null
quelle
change_column_null
.Schienen 4:
quelle
In Rails 4.02+ gibt es laut Dokumentation keine Methode wie
update_all
bei 2 Argumenten. Stattdessen kann man diesen Code verwenden:quelle
Sie können add_timestamps und null: false nicht verwenden, wenn Sie über vorhandene Datensätze verfügen. Hier ist die Lösung:
quelle