Я создаю несколько миграций, некоторые из которых представляют собой стандартные миграции "создать таблицу" или "изменить таблицу", а некоторые из них изменяют данные. Я использую свои настоящие модели ActiveRecord для изменения данных, например:
Blog.all.each do |blog|
update_some_blog_attributes_to_match_new_schema
end
Проблема в том, что если я загружаю класс Blog, затем изменяю таблицу, а затем снова использую класс Blog, модели имеют старые определения таблиц и не могут сохранять в новую таблицу. Есть ли способ перезагрузить классы и их определения атрибутов, чтобы я мог их повторно использовать?





Ответ положительный!
Blog.reset_column_information
Сбросить все столбцы! ActiveRecord::Base.descendants.each{|c| c.reset_column_information}
Бросьте Rails.application.eager_load! перед любыми вызовами потомков, чтобы исправить проблемы с не автозагружаемыми моделями
Интересно, почему это не запускается автоматически после каждого обновления схемы, поскольку миграции не очень критичны по времени.
Создайте новые экземпляры:
Old_blogs = Blog.all
# change/modify db table in here
New_blogs = Blog.all # this should be reloaded or you could use the .reload on this
# change information, load old into new
Old_blogs.each do |blog|
New_blogs.find(blog.id).title = blog.title
end
Я всегда использовал новые модели в миграциях
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 удобнее.
Остерегайтесь моделей с отношениями. Если
class Blog; belongs_to Owner; end, то вам может понадобитьсяOwner.reset_column_informationв дополнение к Blog.