Como posso forçar ActiveRecord para recarregar uma classe?
-
03-07-2019 - |
Pergunta
Estou criando um bando de migrações, alguns dos quais são standard "criar a tabela" ou "modificar a tabela" migrações, e alguns dos quais dados modificar. Eu estou usando meus modelos ActiveRecord reais para modificar os dados, a la:
Blog.all.each do |blog|
update_some_blog_attributes_to_match_new_schema
end
O problema é que se eu carregar a classe Blog, em seguida, modificar a tabela, em seguida, usar a classe Blog novamente, os modelos têm as definições da tabela de idade, e não pode salvar para a nova tabela. Existe uma maneira de recarregar as classes e as suas definições de atributos para que eu possa reutilizá-los?
Solução
A resposta é sim!
Blog.reset_column_information
Outras dicas
Eu sempre usado novos modelos em migrações
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
Mas Blog.reset_column_information
é mais conveniente.
Criar novas instâncias:
Old_blogs = Blog.all
# alterar / modificar db mesa aqui
New_blogs = Blog.all # this should be reloaded or you could use the .reload on this
# informações de alteração, carregue velho em novo
ex.
Old_blogs.each do |blog|
New_blogs.find(blog.id).title = blog.title
end