【问题标题】:Rails Migrations: the code evolved and the migration is not valid anymore : what to do?Rails 迁移:代码演变,迁移不再有效:怎么办?
【发布时间】:2014-05-22 08:25:48
【问题描述】:

所以我有这个迁移,它处理我的Model,然后向它添加一个:deleted_at 列。

class HandleMyModel < ActiveRecord::Migration
  def up
    Model.all.each do |m|
      m.process_data # whatever it is
    end
    add_column :models, :deleted_at, :datetime
  end

  def down
    Model.all.each do |m|
      m.unprocess_data # whatever it is
    end
    remove_column :models
  end

end

本地我加rake db:migrate,一切顺利。

然后,我在Model 中添加了一个默认范围:

def Model < ActiveRecord::Base
  default_scope where(:deleted_at => nil)
end

我全部提交,然后推送到其他环境(开发)。但是在那里,当我运行迁移时,我收到一个错误 undefined column deleted_at in Model,这是有道理的,因为包含 default_scopeModel.all 查询但 deleted_at 尚不存在。

遇到这种情况我该怎么办?

  • 我应该评论default_scope,直到每个环境都迁移(脏)?
  • 我是否应该在这种情况下创建单独的迁移(数据迁移 + 数据库结构迁移)并在失败时重新排序(仍然有点脏)?
  • 我可以告诉迁移使用代码的某个提交来运行自己吗?
  • 我搞砸了吗?

感谢支持

【问题讨论】:

    标签: ruby-on-rails git database-migration


    【解决方案1】:

    在处理数据之前,您需要将deleted_at 列添加到Model。但是您还需要在Model 定义到达Model.all 之前重置它,以便找到新的deleted_at 列。

    例如:

    class HandleMyModel < ActiveRecord::Migration
      def up
        add_column :models, :deleted_at, :datetime
    
        Model.reset_column_information    # <-- this line will allow the new :deleted_at column to be see in Model.all
    
        Model.all.each do |m|
          m.process_data # whatever it is
        end
      end
    
      def down
        Model.all.each do |m|
          m.unprocess_data # whatever it is
        end
        remove_column :models, :deleted_at
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2013-08-06
      • 1970-01-01
      • 2014-12-01
      相关资源
      最近更新 更多