Как заставить ActiveRecord перезагрузить класс?
-
03-07-2019 - |
Вопрос
Я создаю несколько миграций, некоторые из которых являются стандартными миграциями «создать таблицу» или «изменить таблицу», а некоторые из них изменяют данные.Я использую свои настоящие модели ActiveRecord для изменения данных, а-ля:
Blog.all.each do |blog|
update_some_blog_attributes_to_match_new_schema
end
Проблема в том, что если я загружу класс Blog, затем изменю таблицу, а затем снова использую класс Blog, модели будут иметь старые определения таблиц и не смогут сохранить их в новую таблицу.Есть ли способ перезагрузить классы и определения их атрибутов, чтобы я мог использовать их повторно?
Решение
Ответ – да!
Blog.reset_column_information
Другие советы
Я всегда использовал новые модели при миграции
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
это удобнее.
Создайте новые экземпляры:
Old_blogs = Blog.all
# здесь изменить/изменить таблицу БД
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