ruby-on-rails - remove - rollback migration rails
Migraciones de Rails: Deshacer la configuraciĆ³n predeterminada para una columna (4)
Rieles 5+
def change
change_column_default( :table_name, :column_name, from: nil, to: false )
end
Rieles 3 y Rieles 4
def up
change_column_default( :table_name, :column_name, nil )
end
def down
change_column_default( :table_name, :column_name, false )
end
Tengo el problema, que tengo una migración en Rails que establece una configuración predeterminada para una columna, como este ejemplo:
def self.up
add_column :column_name, :bought_at, :datetime, :default => Time.now
end
Supongamos que me gusta eliminar esa configuración predeterminada en una migración posterior, ¿cómo hago eso con el uso de migraciones ferroviarias?
Mi solución actual es la ejecución de un comando SQL personalizado en la migración de rieles, como este:
def self.up
execute ''alter table column_name alter bought_at drop default''
end
Pero no me gusta este enfoque, porque ahora dependo de cómo la base de datos subyacente interpreta este comando. En caso de un cambio de la base de datos, esta consulta quizás ya no funcione y la migración se interrumpiría. Entonces, ¿hay una manera de expresar el deshacer de una configuración predeterminada para una columna en rieles?
El siguiente fragmento de código que utilizo para que las columnas NOT NULL
, pero se omite DEFAULT
en el nivel de esquema:
def self.up
change_column :table, :column, :string, :null => false, :default => ""
change_column_default(:table, :column, nil)
end
Rieles 4
change_column :courses, :name, :string, limit: 100, null: false
Sounds que estás haciendo lo correcto con tu ''ejecutar'', como señalan los documentos:
change_column_default(table_name, column_name, default)
Establece un nuevo valor predeterminado para una columna. Si desea establecer el valor predeterminado en NULL, no tiene suerte. Es necesario que DatabaseStatements # ejecute la instrucción SQL apropiada. Ejemplos
change_column_default(:suppliers, :qualification, ''new'') change_column_default(:accounts, :authorized, 1)