2008-10-14 30 views
56

Estoy creando un conjunto de migraciones, algunas de las cuales son migraciones estándar de "crear tabla" o "modificar tabla", y algunas de las cuales modifican datos. Estoy usando mis modelos reales ActiveRecord para modificar los datos, al estilo de:¿Cómo forzo a ActiveRecord a volver a cargar una clase?

Blog.all.each do |blog| 
    update_some_blog_attributes_to_match_new_schema 
end 

El problema es que si me carga la clase Blog, a continuación, modificar la tabla, a continuación, utilizar la clase Blog de nuevo, los modelos tienen la definiciones de tablas antiguas, y no se puede guardar en la nueva tabla. ¿Hay alguna manera de volver a cargar las clases y sus definiciones de atributos para poder reutilizarlas?

Respuesta

124

¡La respuesta es sí!

Blog.reset_column_information 
+2

Tenga cuidado con los modelos con relaciones. Si 'clase Blog; belongs_to Propietario; end', luego puede necesitar 'Owner.reset_column_information' además de Blog. –

+3

Restablecer todas las columnas! 'ActiveRecord :: Base.descendants.each {| c | c.reset_column_information} ' – zm1th

+0

Tirar' Rails.application.eager_load! 'delante de cualquier llamada a descendientes para solucionar problemas con modelos no autocargados – elju

2

crear nuevas instancias:


Old_blogs = Blog.all 

#/cambio de modificar la tabla db aquí

New_blogs = Blog.all # this should be reloaded or you could use the .reload on this 

# cambiar información, cargar edad en el nuevo

ex.

Old_blogs.each do |blog| 
    New_blogs.find(blog.id).title = blog.title 
end 
4

siempre he usado nuevos modelos de migraciones

MyBlog < ActiveRecord::Base 
     set_table_name 'blogs' 
    end 

    def self.up 
     MyBlog.all.each do |blog| 
     update_some_blog_attributes_to_match_new_schema 
     end 
    end 

Pero Blog.reset_column_information es más conveniente.

Cuestiones relacionadas