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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top