2008-10-14 3 views
56

나는 여러 가지 마이그레이션을 만들고 있는데, 그 중 일부는 표준 "create table"또는 "modify table"마이그레이션이며, 일부는 데이터를 수정합니다. 나는 라, 데이터를 수정하는 내 실제 액티브 모델을 사용하고 있습니다 :ActiveRecord가 클래스를 다시로드하도록하려면 어떻게해야합니까?

Blog.all.each do |blog| 
    update_some_blog_attributes_to_match_new_schema 
end 

문제는 내가 블로그 클래스를로드하는 경우, 다음, 다음, 테이블을 수정하여 다시 블로그 클래스를 사용한다는 것입니다, 모델이 있습니다 이전 테이블 정의를 사용하고 새 테이블에 저장할 수 없습니다. 클래스와 속성 정의를 다시로드하여 재사용 할 수있는 방법이 있습니까?

답변

124

대답은 예입니다!

Blog.reset_column_information 
+2

관계가있는 모델을주의하십시오. 'class Blog; belongs_to 소유자; end'를 사용한다면 Blog 이외에'Owner.reset_column_information'이 필요할 수도 있습니다. –

+3

모든 열을 재설정하십시오! 'ActiveRecord :: Base.descendants.each {| c | c.reset_column_information}' – zm1th

+0

자손에 대한 호출 앞에'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 

# 변경 정보를 DB 테이블을 수정 신규

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이 더 편리에 새로운 모델을 사용했다.

관련 문제