Я создаю множество миграций, некоторые из которых являются стандартными миграциями "create table" или "alter table", а некоторые из них изменяют данные. Я использую свои фактические модели ActiveRecord для изменения данных, a la:
Blog.all.each do |blog|
update_some_blog_attributes_to_match_new_schema
end
Проблема в том, что если я загружаю класс Blog, то изменяю таблицу, а затем снова использую класс Blog, модели имеют старые определения таблиц и не могут сохранить новую таблицу. Есть ли способ перезагрузить классы и их определения атрибутов, чтобы я мог их повторно использовать?
Ответ 1
Ответ да!
Blog.reset_column_information
Ответ 2
Я всегда использовал новые модели при миграции
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
Но Blog.reset_column_information
более удобно.
Ответ 3
Создайте новые экземпляры:
Old_blogs = Blog.all
# изменить/изменить таблицу db здесь
New_blogs = Blog.all # this should be reloaded or you could use the .reload on this
# изменить информацию, загрузить старый в новый
ех.
Old_blogs.each do |blog|
New_blogs.find(blog.id).title = blog.title
end