背景
我们有一个如下的rails迁移脚本:
...
...
0011_update_column1_for_internal_projects.rb
...
...
0022_create_audits.rb
我们为 InternalProject 模型创建了 after_create/update/delete 回调,更新 Audits 表以跟踪模型上发生的事件。
代码片段
DB 迁移脚本 - 0011 - 的self.up方法定义如下:
def self.up
InternalProject.all.each do |project|
project.column1 = project.column2
project.save!
end
end
副作用
使用 0022 脚本时,我们遇到了脚本 0011 无法迁移的情况,因为我们有测试夹具来为内部项目加载一些种子数据。现在这个失败了,因为在保存 InternalProject 时回调被触发,并且在 DB 状态的那一刻,因为 0022 没有运行,审计表不存在,所以我们得到一个 SQL 错误,感叹该表不存在.
我的问题
1. 如何修复 0011 DB 迁移脚本,以防止在保存 InternalProject 时调用回调?我想知道这样做的巧妙方法。
2.让我怀疑这样的更新脚本是否会被删除。这是个坏主意吗?我们是否应该在数据库迁移中拥有用于数据操作的脚本?
3. DB迁移脚本应该有数据操作脚本,我们可以做些什么吗?