¿Cómo fuerzo a ActiveRecord a recargar una clase?
-
03-07-2019 - |
Pregunta
Estoy creando un montón de migraciones, algunas de las cuales son estándar " crear tabla " o " modificar tabla " Migraciones, y algunas de las cuales modifican datos. Estoy usando mis modelos reales de ActiveRecord para modificar los datos, a la:
Blog.all.each do |blog|
update_some_blog_attributes_to_match_new_schema
end
El problema es que si cargo la clase Blog, luego modifico la tabla, luego uso la clase Blog nuevamente, los modelos tienen las definiciones de la tabla anterior y no pueden guardar en la tabla nueva. ¿Hay alguna forma de volver a cargar las clases y sus definiciones de atributos para que pueda volver a usarlas?
Solución
¡La respuesta es sí!
Blog.reset_column_information
Otros consejos
Siempre usé modelos nuevos en 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.
Crear nuevas instancias:
Old_blogs = Blog.all
# cambiar / 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 lo antiguo en lo nuevo
ej.
Old_blogs.each do |blog|
New_blogs.find(blog.id).title = blog.title
end