2008-10-14 15 views
56

Sto creando un sacco di migrazioni, alcune delle quali sono migrazioni standard "crea tabella" o "modifica tabella", e alcune delle quali modificano i dati. Sto usando il mio modelli reali ActiveRecord per modificare i dati, a la:Come forzare ActiveRecord a ricaricare una classe?

Blog.all.each do |blog| 
    update_some_blog_attributes_to_match_new_schema 
end 

Il problema è che se io carico la classe Blog, quindi modificare la tabella, quindi utilizzare di nuovo la classe Blog, i modelli hanno la vecchie definizioni di tabella e non è possibile salvare nella nuova tabella. C'è un modo per ricaricare le classi e le loro definizioni degli attributi così posso riutilizzarle?

risposta

124

La risposta è sì!

Blog.reset_column_information 
+2

Fare attenzione ai modelli con relazioni. Se 'classe Blog; appartiene al proprietario; fine', quindi potrebbe essere necessario 'Owner.reset_column_information' oltre a Blog. –

+3

Ripristina tutte le colonne! 'ActiveRecord :: Base.descendants.each {| c | c.reset_column_information} ' – zm1th

+0

Lancia' Rails.application.eager_load! 'di fronte a qualsiasi chiamata ai discendenti per risolvere i problemi con i modelli non autoloaded – elju

2

creare nuove istanze:


Old_blogs = Blog.all 

# cambiamento/modifica tabella db qui

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

# informazioni cambiamento, caricare vecchio in new

ex.

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

ho sempre usato i nuovi modelli nelle migrazioni

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 

Ma Blog.reset_column_information è più conveniente.