重新排序/更改迁移文件的时间戳

时间:2016-03-23 19:02:22

标签: ruby-on-rails postgresql rails-migrations ruby-on-rails-5

我的一个迁移文件正在引用另一个将在迁移序列中进一步创建的表/模型。

Postgres不喜欢这样:

  

PG :: UndefinedTable:错误:关系“用户”不存在

所以我想知道手动重新排序迁移文件是否存在任何潜在问题(通过发明新的时间戳/前缀)?

受影响的表格已经向下迁移。

2 个答案:

答案 0 :(得分:2)

运行rake db:migrate命令时,它会比较位于db / migrate文件夹中的schema_migrations表和迁移文件。然后,所有未执行的迁移都会收到MigrationClass#up

因此,从您的代码已发布和/或迁移由其他用户运行时开始,更改迁移时间戳/名称可能会导致无法处理的迁移过程(因为schema_migrations将使用更改的时间戳处理迁移作为新的,未经处理的,并尝试“再次”处理它)。可能的解决方法是暂时评论up方法的内容,并在迁移完成后取消注释。为了好玩,您还可以直接从数据库控制台操作schema_migrations表(添加或删除必要的记录)。这两种方式都闻起来像是黑客。

直到那时......一切都应该完美无缺。

答案 1 :(得分:0)

这对于我来说同样适用于这种情况,即使它是一个黑客。

Rails按时间戳的顺序运行迁移,Rails跟踪迁移文件名的时间戳部分运行的迁移,但不跟踪文件名的其余部分。因此,如果您需要更改两次迁移的顺序,因为前一次迁移引用后一种迁移,您只需通过重命名两个迁移文件来切换文件名的14位时间戳部分。如果时间戳被一个数字关闭,Rails会认为这是一个新的迁移,所以在更改之前将它们写下来。