如何在Rails 2.1及更高版本中应用迁移脚本?

时间:2009-07-29 18:49:30

标签: ruby-on-rails migration

我不是Rails开发人员(目前)所以请原谅我对此的无知。

我一直喜欢Rails的一件事是迁移以及它如何满足所有语言和平台的共同需求。话虽如此,我很想知道在2.1中所做的更改会导致某种情况。

根据我的判断,Rails 2.1及更高版本对迁移逻辑进行了两处更改。第一种是在生成时使用基于时间戳的脚本名称,以便在将文件添加到源代码控制之前减少2个开发人员同时处理同一文件的概率。因此,生成脚本时,它现在是20090729123456_test.rb而不是002_test.rb。

第二项是Schema_Info表替换为Schema_Migrations表,该表显示了迁移列表,而不仅仅是最新版本号。

通过Rails源代码,我注意到架构的“当前版本”是Schema_Migration表中的最大版本。

以下是我想弄清楚的情景:

开发人员A生成一个新脚本:20090729120000_test.rb。

开发人员B生成一个新脚本:20090729130000_test.rb。

开发人员B首先将他的脚本迁移到数据库,方法是不指定版本号,并假设尚未添加Developer A的脚本。

当开发人员A添加他的脚本并尝试迁移到最新版本时会发生什么,因为他的脚本版本(基于时间戳)现在小于当前应用的版本?

2 个答案:

答案 0 :(得分:1)

我不是肯定的,但我相信他必须做一个“rake db:rollback”撤消Developer B迁移,然后运行“rake db:migrate”以正确的顺序执行这两个操作。当然,如果两个开发人员在不需要彼此集成的表上独立工作(如本例所示,由于开发人员B不必等待开发人员A运行他的迁移),开发人员A可以简单地添加一个开发人员B迁移的时间戳,它将再次按正确顺序排列。

答案 1 :(得分:0)

简短的回答是:不要担心。

rake db:migrate将尝试运行schema_migrations表中找不到的任何迁移。如果有更新的迁移已经运行并不重要。

如果B依赖于A并且必须按该顺序运行,那么您可能会遇到问题,但这是开发人员之间的问题。