一連の移行を作成しています。それらの一部は標準の「テーブルの作成」または「テーブルの変更」の移行であり、一部はデータを変更します。私は実際のActiveRecordモデルを使用して、データを変更しています:
Blog.all.each do |blog|
update_some_blog_attributes_to_match_new_schema
end
問題は、Blogクラスをロードしてからテーブルを変更し、再度Blogクラスを使用すると、モデルに古いテーブル定義があり、新しいテーブルに保存できないことです。クラスとその属性定義を再ロードして再利用できる方法はありますか?
答えはイエスです!
Blog.reset_column_information
移行では常に新しいモデルを使用しました
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
だが Blog.reset_column_information
の方が便利です。
新しいインスタンスを作成します。
Old_blogs = Blog.all
#ここでdbテーブルを変更/修正
New_blogs = Blog.all # this should be reloaded or you could use the .reload on this
#情報を変更し、古いものを新しいものにロード
Old_blogs.each do |blog|
New_blogs.find(blog.id).title = blog.title
end