Rotaie migrazioni: Annulla impostazione predefinita per una colonna
-
23-08-2019 - |
Domanda
ho il problema, che ho un migrazione Rails che imposta un'impostazione predefinita per una colonna, come in questo esempio:
def self.up
add_column :column_name, :bought_at, :datetime, :default => Time.now
end
E se, mi piace far cadere che le impostazioni predefinite in una migrazione in seguito, come posso fare che con l'utilizzo di rotaie migrazioni?
La mia soluzione attuale è l'esecuzione di un comando SQL personalizzata nella migrazione rotaie, in questo modo:
def self.up
execute 'alter table column_name alter bought_at drop default'
end
Ma non mi piace questo approccio, perché io sono ora dipende da come il database sottostante interpreta questo comando. In caso di modifica del database questa domanda forse potrebbe non funziona più e la migrazione sarebbe rotto. Quindi, c'è un modo per esprimere l'annullamento di un'impostazione di default per una colonna in rotaie?
Soluzione
Rotaie 5 +
def change
change_column_default( :table_name, :column_name, from: nil, to: false )
end
Rails 3 e Rails 4
def up
change_column_default( :table_name, :column_name, nil )
end
def down
change_column_default( :table_name, :column_name, false )
end
Altri suggerimenti
Suona come che stai facendo la cosa giusta con il vostro 'eseguire', come la documentazione sottolineano:
change_column_default(table_name, column_name, default)
Imposta un nuovo valore predefinito per una colonna. Se si desidera impostare il valore di default NULL, siete fuori di fortuna. Hai bisogno a DatabaseStatements # eseguire il istruzione SQL appropriata se stessi. Esempi
change_column_default(:suppliers, :qualification, 'new') change_column_default(:accounts, :authorized, 1)
Il seguente frammento che utilizzo per fare le colonne NULL
NOT NULL
, ma saltare DEFAULT
a livello di schema:
def self.up
change_column :table, :column, :string, :null => false, :default => ""
change_column_default(:table, :column, nil)
end
Rails 4
change_column :courses, :name, :string, limit: 100, null: false