如何将所有迁移文件转换为Rails中的单个文件?

时间:2016-03-20 16:39:39

标签: ruby-on-rails rails-migrations

我一直在使用Ruby on Rails开发一个项目。在开发过程中,我为我的项目生成了大量的迁移文件。有时我添加和删除了不同表中的列。

有没有办法可以将多个文件中的所有迁移合并到一个文件中?

3 个答案:

答案 0 :(得分:9)

TL; DR

您需要的不是一整套整合的迁移;它是单个模式文件和可选的 seeds.rb 文件。 Rails一般为maintains the schema automagically when you run migrations,所以你已经拥有了你应该需要的大部分内容,除了种子数据之外,如下所述。

使用架构,而不是迁移

通常,您不应该维护大量迁移。相反,您应该定期清除迁移,并使用 schema.rb schema.sql 来(重新)创建数据库。 Rails guides specifically state

  

通过重播整个迁移历史记录,无需(并且容易出错)部署应用程序的新实例。只需将当前模式的描述加载到数据库中就简单快捷了......由于模式转储是数据库模式的权威来源,因此强烈建议您将它们检入源代码控制中。

因此,您应该使用bin/rails db:schema:load而不是运行迁移,或者在旧版本的Rails上运行相关的Rake任务。

数据迁移

虽然您可以使用迁移来修复或修复与最近架构更改相关的数据,但数据迁移(如果使用的话)应该是临时工件。数据迁移几乎从不是幂等的,因此您不应长期维护数据迁移。 The guide says

  

有些人使用迁移将数据添加到数据库中......但是,Rails有一个“种子”功能,应该用于为初始数据播种数据库。这是一个非常简单的功能:只需用一些Ruby代码填充db / seeds.rb,然后运行rake db:seed ...这通常是设置空白应用程序数据库的一种更简洁的方法。

数据库种子数据应该加载bin/rails db:seed(或关联的Rake任务),而不是在迁移中维护数据。

答案 1 :(得分:2)

有一个宝石声称可以完全按照您在问题中描述的内容进行操作 - 请查看Squasher

来自自述文件:  " Squasher压缩Rails应用程序中的旧迁移。 ... Squasher删除所有迁移并使用指定日期的最终数据库状态创建单个迁移(新迁移将看起来像一个模式)。"

答案 2 :(得分:1)

您必须手动执行合并

但如果您只想要一个文件,则db/schema.rb。它包含当前数据库架构的快照。如果需要,可以直接将其加载到数据库中。