Rails-Migrationen: Standardeinstellung für eine Spalte Rückgängig
-
23-08-2019 - |
Frage
Ich habe das Problem, dass ich eine Migration in Rails habe, die eine Standardeinstellung für eine Spalte, wie in diesem Beispiel aufstellt:
def self.up
add_column :column_name, :bought_at, :datetime, :default => Time.now
end
Nehmen wir an, Ich mag, dass die Standardeinstellungen in einer späteren Migration fallen, wie mache ich das mit Schienen-Migrationen mit?
Meine aktuelle Problemumgehung ist die Ausführung einer benutzerdefinierten SQL-Befehl in den Schienen Migration, wie folgt aus:
def self.up
execute 'alter table column_name alter bought_at drop default'
end
Aber ich mag diesen Ansatz nicht, weil ich jetzt angewiesen bin, wie die zugrunde liegende Datenbank diesen Befehl interpretiert. Im Fall einer Änderung der Datenbank diese Abfrage könnte vielleicht nicht mehr funktionieren und die Migration würde gebrochen werden. So ist es eine Möglichkeit, die Undo einer Standardeinstellung für eine Spalte in Schienen auszudrücken?
Lösung
Rails 5 +
def change
change_column_default( :table_name, :column_name, from: nil, to: false )
end
Rails 3 und Rails 4
def up
change_column_default( :table_name, :column_name, nil )
end
def down
change_column_default( :table_name, :column_name, false )
end
Andere Tipps
Sounds wie Sie tun das richtige mit Ihrem ‚ausführen‘, wie die Dokumente hinweisen:
change_column_default(table_name, column_name, default)
Setzt einen neuen Standardwert für eine Spalte. Wenn Sie den Standardwert festlegen möchten auf NULL, sind Sie kein Glück. Du brauchst zu DatabaseStatements # führen Sie die entsprechende SQL-Anweisung selbst. Beispiele
change_column_default(:suppliers, :qualification, 'new') change_column_default(:accounts, :authorized, 1)
Das folgende Snippet ich verwenden, um NULL
Spalten NOT NULL
zu machen, aber überspringen DEFAULT
auf Schemaebene:
def self.up
change_column :table, :column, :string, :null => false, :default => ""
change_column_default(:table, :column, nil)
end
Schienen 4
change_column :courses, :name, :string, limit: 100, null: false