2008-10-14 3 views
56

Я создаю множество миграций, некоторые из которых являются стандартными миграциями «create table» или «alter table», а некоторые из них изменяют данные. Я использую свои реальные модели ActiveRecord для изменения данных, а-ля:Как заставить ActiveRecord перезагрузить класс?

Blog.all.each do |blog| 
    update_some_blog_attributes_to_match_new_schema 
end 

Проблема заключается в том, что если я загрузить класс блога, а затем изменить таблицу, а затем снова использовать класс Блог, модели имеют старых табличных определений и не может сохранить в новой таблице. Есть ли способ перезагрузить классы и их определения атрибутов, чтобы я мог их повторно использовать?

ответ

124

Ответ да!

Blog.reset_column_information 
+2

Остерегайтесь моделей с отношениями. Если 'class Blog; own_to Owner; end', то вам может понадобиться 'Owner.reset_column_information' в дополнение к блогу. –

+3

Сбросить все столбцы! 'ActiveRecord :: Base.descendants.each {| c | c.reset_column_information} ' – zm1th

+0

Throw' Rails.application.eager_load! 'перед любыми вызовами потомков для исправления проблем с неавтозагрузочными моделями – elju

2

Создание новых экземпляров:


Old_blogs = Blog.all 

# изменение/изменить таблицы БД здесь

New_blogs = Blog.all # this should be reloaded or you could use the .reload on this 

# информация изменения, загружать старые в новые

ex.

Old_blogs.each do |blog| 
    New_blogs.find(blog.id).title = blog.title 
end 
4

Я всегда использовал новые модели миграции

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 более удобно.