Rails中的聚合迁移

我有几十个Rails数据库迁移,写了一年多。 有没有办法将它们聚合到一个迁移,以便我只看到数据库的完整DDL语句,因为它现在存在? 我只需要当前的快照,没有我们如何达到它的所有历史记录。

聚合迁移是可能的,但可能不是一个好主意

也许问:

  • 你为什么要这样做?
  • 您多久需要一直迁移到VERSION = 0然后再次备份?
  • 真的坏了吗? (如果没有,那么不要修复它)

我曾经遇到过同样的问题..我最终只是重新排序我的迁移,因为模式的变化导致它不能正确地向上/向下迁移。 我会犹豫再做一次。

如果您的迁移只是添加字段或索引,那么您可以将它们与模型的主迁移结合起来 – 但要注意,您不能再重现旧情况,例如旧的DB转储可能与迁移不兼容他们应该兼容的数字 – 这可能是反对聚合的最大争论……

从技术上讲,您可以转储模式然后直接加载 – 这是一种方式:

rake db:schema:dump 

然后使用模式转储文件db / schema.rb的内容创建单个新迁移

以下是一些类似的问题:

  • Rebase Rails在长期运行的项目中进行迁移

  • 删除/“重新绑定”rails迁移

  • “扁平化”Rails迁移的方法?

  • 我应该展平Rails迁移吗?


PS:我发现坚持旧的迁移编号方案是有用的,迁移不使用时间戳 – 对我来说这更好用(更容易看到它们的顺序)。

例如在config / application.rb文件中:

 config.active_record.timestamped_migrations = false 

您永远不应该使用所有迁移来启动和运行数据库。 当前的schema.rb始终是DB“目前”的样子。

如果您有大量的迁移,最好定期截断您的迁移。 我们最终使用我们的一个较大的应用程序,从文件夹中删除了50个迁移,因为唯一重要的是schema.rb。 迁移只是一种迁移和更改数据库现有状态的方法。 他们应该只运行一次。

您只需将当前架构加载到数据库中即可。

rake db:schema:load RAILS_ENV=[production, test, etc.]

这将采用schema.rb文件的模式版本,并将其加载到数据库中而不运行单个迁移。

注意:如果您有将数据放入数据库的迁移(例如,默认值),则该数据将不会添加到数据库中。

如果需要将默认值加载到数据库中,可以通过自定义rake任务更好地完成,而不管迁移。