run remove rails migrations data column ruby-on-rails migration

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