ruby-on-rails - remove - rollback migration rails
¿Cómo cambiar una columna que admite nulos para que no se pueda incluir en una migración de Rails? (7)
Creé una columna de fecha en una migración anterior y la configuré como anulable. Ahora quiero cambiarlo para que no sea nulo. ¿Cómo hago esto suponiendo que hay filas nulas en esa base de datos? Estoy de acuerdo con establecer esas columnas en Time.now si actualmente son nulas.
Cree una migración que tenga una instrucción change_column
con un :default =>
.
change_column :my_table, :my_column, :integer, :default => 0, :null => false
Ver: change_column
Dependiendo del motor de la base de datos, puede que necesite usar change_column_null
En Rails 4.02+ de acuerdo con los docs no hay un método como update_all
con 2 argumentos. En su lugar, uno puede usar este código:
# Make sure no null value exist
MyModel.where(date_column: nil).update_all(date_column: Time.now)
# Change the column to not allow null
change_column :my_models, :date_column, :datetime, null: false
En Rails 4, esta es una solución mejor (DRY):
change_column_null :my_models, :date_column, false
Para garantizar que no existan registros con valores null
en esa columna:
MyModel.update_all({ date_column: Time.now }, { date_column: nil })
No puede usar add_timestamps y null: false si tiene registros existentes, así que aquí está la solución:
def change
add_timestamps(:buttons, null: true)
Button.find_each { |b| b.update(created_at: Time.zone.now, updated_at: Time.zone.now) }
change_column_null(:buttons, :created_at, false)
change_column_null(:buttons, :updated_at, false)
end
Rails 4 (otras Rails 4 respuestas tienen problemas):
def change
change_column_null(:users, :admin, false, <put a default value here> )
# change_column(:users, :admin, :string, :default => "")
end
Cambiar una columna con valores NULL para no permitir NULL causará problemas. Este es exactamente el tipo de código que funcionará bien en su configuración de desarrollo y luego se bloqueará cuando intente implementarlo en su producción EN VIVO . Primero debe cambiar los valores NULL a algo válido y luego no permitir NULLs. El 4to valor en change_column_null
hace exactamente eso. Ver documentation para más detalles.
Además, generalmente prefiero establecer un valor predeterminado para el campo, por lo que no será necesario que especifique el valor del campo cada vez que crea un nuevo objeto. Incluí el código comentado para hacer eso también.
Rails 4:
def change
change_column_null(:users, :admin, false )
end
Si lo haces en una migración, probablemente puedas hacerlo así:
# Make sure no null value exist
MyModel.where(date_column: nil).update_all(date_column: Time.now)
# Change the column to not allow null
change_column :my_models, :date_column, :datetime, null: false