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