Comment forcer ActiveRecord à recharger une classe?
-
03-07-2019 - |
Question
Je crée un ensemble de migrations, dont certaines sont des balises "Créer une table" standard. ou "modifier la table" migrations, dont certaines modifient les données. J'utilise mes modèles ActiveRecord actuels pour modifier les données, comme suit:
Blog.all.each do |blog|
update_some_blog_attributes_to_match_new_schema
end
Le problème est que si je charge la classe Blog, puis modifie la table, puis utilise à nouveau la classe Blog, les modèles ont les anciennes définitions de table et ne peuvent pas être enregistrés dans la nouvelle table. Est-il possible de recharger les classes et leurs définitions d'attributs pour que je puisse les réutiliser?
La solution
La réponse est oui!
Blog.reset_column_information
Autres conseils
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 pratique.
Créer de nouvelles instances:
Old_blogs = Blog.all
# modifier / modifier la table de la base de données ici
New_blogs = Blog.all # this should be reloaded or you could use the .reload on this
# modifier les informations, charger l'ancien dans le nouveau
ex.
Old_blogs.each do |blog|
New_blogs.find(blog.id).title = blog.title
end