2008-10-14 13 views
56

Bazıları standart "tablo oluştur" veya "tabloyu değiştir" geçişleri olan ve bir kısmı verileri değiştiren bir grup geçiş yapıyorum. Ben la, verileri değiştirmek için benim gerçek ActiveRecord modelleri kullanıyorum:Bir sınıfı yeniden yüklemek için ActiveRecord'u nasıl zorlarım?

Blog.all.each do |blog| 
    update_some_blog_attributes_to_match_new_schema 
end 

Sorun blog sınıf yüklerseniz, ardından, tabloyu değiştirmek yeniden blog sınıfını kullanmasıdır, modeller var eski tablo tanımları ve yeni tabloya kaydedemezsiniz. Sınıfları ve onların öznitelik tanımlarını yeniden yüklemek için bir yolu var, böylece onları yeniden kullanabilir miyim?

cevap

124

Cevap evet!

Blog.reset_column_information 
+2

İlişkili modellere dikkat edin. Sınıf blog ise; belongs_to Sahibi; Son olarak, Blog'a ek olarak 'Owner.reset_column_information' öğesine de ihtiyacınız olabilir. –

+3

Tüm sütunları sıfırla! 'ActiveRecord :: Base.descendants.each {| c | c.reset_column_information} ' – zm1th

+0

Yüklenmemiş modellerle ilgili sorunları çözmek için alt aramalara yapılan çağrıların önüne Rails.application.eager_load!' ifadesini atın. – elju

2

oluştur yeni örneklerini:


Old_blogs = Blog.all 

# değişiklik eski/yük, burada

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

# değişikliği bilgisini db tabloyu değiştirmek yeni

'dan itibaren.

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

Hep göçler

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 

Ama Blog.reset_column_information daha uygundur yeni modeller kullanıldı.

İlgili konular