Как заставить ActiveRecord перезагружать класс?

Я создаю множество миграций, некоторые из которых являются стандартными миграциями "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