Rails迁移:代码进化了,迁移不再有效:该怎么办



所以我进行了这个迁移,它处理我的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

我提交了所有内容,并将其推送到其他环境(dev)。但在那里,当我运行迁移时,我得到了一个错误undefined column deleted_at in Model,这是有意义的,因为Model.all查询包含default_scope,但deleted_at还不存在。

在这种情况下我该怎么办

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

感谢对的支持

在处理数据之前,需要将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

相关内容

最新更新