【问题标题】:How do I force ActiveRecord to reload a class?如何强制 ActiveRecord 重新加载一个类?
【发布时间】:2008-10-14 11:40:13
【问题描述】:

我正在创建一堆迁移,其中一些是标准的“创建表”或“修改表”迁移,其中一些是修改数据。我正在使用我的实际 ActiveRecord 模型来修改数据,例如:

Blog.all.each do |blog|
  update_some_blog_attributes_to_match_new_schema
end

问题是如果我加载博客类,然后修改表,然后再次使用博客类,模型有旧表定义,无法保存到新表。有没有办法重新加载类及其属性定义以便我可以重用它们?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord migration


    【解决方案1】:

    答案是肯定的!

    Blog.reset_column_information
    

    【讨论】:

    • 注意有关系的模型。如果class Blog; belongs_to Owner; end,那么除了Blog,你可能还需要Owner.reset_column_information。
    • 重置所有列! ActiveRecord::Base.descendants.each{|c| c.reset_column_information}
    • 在任何对后代的调用前抛出 Rails.application.eager_load! 以解决非自动加载模型的问题
    • 我想知道为什么每次架构更新后都不会自动触发,因为迁移不是很时间关键。
    【解决方案2】:

    我总是在迁移中使用新模型

        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更方便。

    【讨论】:

      【解决方案3】:

      创建新实例:


      Old_blogs = Blog.all
      

      #在此处更改/修改数据库表

      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
      

      【讨论】:

        猜你喜欢
        • 2018-02-17
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-05
        • 2011-12-12
        相关资源
        最近更新 更多