2008-10-14 7 views
56

Je crée un tas de migrations, dont certaines sont des migrations standard "créer une table" ou "modifier une table", et certaines d'entre elles modifient des données. J'utilise mes modèles ActiveRecord réels pour modifier les données, à la:Comment forcer ActiveRecord à recharger une classe?

Blog.all.each do |blog| 
    update_some_blog_attributes_to_match_new_schema 
end 

Le problème est que si je charge la classe de blog, puis modifier la table, puis utilisez la classe Blog à nouveau, les modèles ont la anciennes définitions de table et ne peut pas enregistrer dans la nouvelle table. Existe-t-il un moyen de recharger les classes et leurs définitions d'attributs afin que je puisse les réutiliser?

Répondre

124

La réponse est oui!

Blog.reset_column_information 
+2

Attention aux modèles avec relations. Si 'class Blog; belongs_to Propriétaire; end', alors vous devrez peut-être 'Owner.reset_column_information' en plus de Blog. –

+3

Réinitialiser toutes les colonnes! 'ActiveRecord :: Base.descendants.each {| c | c.reset_column_information} ' – zm1th

+0

Lance' Rails.application.eager_load! 'devant tous les appels aux descendants pour corriger les problèmes avec les modèles non-auto-chargés – elju

2

Créer de nouvelles instances:


Old_blogs = Blog.all 

# changement/modifier la table db ici

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

# information sur le changement, charge vieux en nouveau

ex.

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

J'ai toujours utilisé de nouveaux modèles dans les migrations

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 

Mais Blog.reset_column_information est plus commode.

Questions connexes