Migraciones de Rails: el código evolucionó y la migration ya no es válida: ¿qué hacer?

Entonces tengo esta migration, que procesa mi Model y luego agrega una columna :deleted_at .

 class HandleMyModel < ActiveRecord::Migration def up Model.all.each do |m| m.process_data # whatever it is end add_column :models, :deleted_at, :datetime end def down Model.all.each do |m| m.unprocess_data # whatever it is end remove_column :models end end 

A nivel local agrego rake db:migrate , todo va bien.

Luego, agregué un scope pnetworkingeterminado a mi Model :

 def Model < ActiveRecord::Base default_scope where(:deleted_at => nil) end 

Lo comprometo todo, y empujo a otro entorno (dev). Pero ahí, cuando ejecuto la migration, obtengo una undefined column deleted_at in Model error undefined column deleted_at in Model que tiene sentido ya que las consultas de Model.all default_scope incluidas pero deleted_at aún no existe.

¿Qué debería hacer en este tipo de situación?

  • ¿Debo comentar el default_scope hasta que todos los entornos default_scope migrados (sucios)?
  • ¿Debo crear migraciones separadas en este tipo de situación (migration de datos + migration de estructura db) y reorderarlas cuando falla (aún un poco sucias)?
  • ¿Puedo decirle a la migration que use cierta confirmación del código para ejecutarse?
  • ¿Estoy jodido?

Gracias por el apoyo

Necesita agregar la columna deleted_at al Model antes de procesar los datos. Pero también debe restablecer la definición del Model antes de que Model.all al Model.all para que se encuentre la nueva columna deleted_at .

Por ejemplo:

 class HandleMyModel < ActiveRecord::Migration def up add_column :models, :deleted_at, :datetime Model.reset_column_information # <-- this line will allow the new :deleted_at column to be see in Model.all Model.all.each do |m| m.process_data # whatever it is end end def down Model.all.each do |m| m.unprocess_data # whatever it is end remove_column :models, :deleted_at end end