web-dev-qa-db-ja.com

ActiveRecordにクラスを強制的に再読み込みさせるにはどうすればよいですか?

一連の移行を作成しています。それらの一部は標準の「テーブルの作成」または「テーブルの変更」の移行であり、一部はデータを変更します。私は実際のActiveRecordモデルを使用して、データを変更しています:

Blog.all.each do |blog|
  update_some_blog_attributes_to_match_new_schema
end

問題は、Blogクラスをロードしてからテーブルを変更し、再度Blogクラスを使用すると、モデルに古いテーブル定義があり、新しいテーブルに保存できないことです。クラスとその属性定義を再ロードして再利用できる方法はありますか?

59
James A. Rosen

答えはイエスです!

Blog.reset_column_information
131
James A. Rosen

移行では常に新しいモデルを使用しました

    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の方が便利です。

5
Vitalie

新しいインスタンスを作成します。


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
3
Jon Smock