En muchas ocasiones nos encontramos con este problema: Creamos una migración para añadir una columna a nuesto modelo y queremos inicializarla con valores que dependen de otros. Al iniciar el enviroment de la migración se precargan en memoria los datos de las clases (también sus columnas), y la función add_column no hace que se vuelvan a interpretar dichas clases.
Por ello tenemos que recurrir la función Model.reset_column_information que nos proporciona ActiveRecord::Base.
Un ejemplo de uso sería:
class AddPrecioOfertaProductos < ActiveRecord::Migration
def self.up
add_column :productos, :precio_oferta, :decimal
Producto.reset_column_information #Recargamos la información de las columnas
Producto.all.each do |producto|
maravilloso_codigo_que_inicializa_el_precio_en_oferta
end
end
def self.down
remove_column :productos, :precio_oferta
end
end
La primera vez que necesite esto me volví loco para encontrarlo y creo que termine por hacer dos migraciones, así qué para que eso no os ocurra…
