ruby 如何使ActiveRecord在开始时加载具有相同序列号的不同迁移(从不同的迁移目录)?

2uluyalo  于 2023-04-20  发布在  Ruby
关注(0)|答案(1)|浏览(95)

我正在开发一个Web应用程序,并考虑为这个应用程序制作插件,以便其他开发人员也可以使用它们或创建插件。
问题是迁移。我想在插件迁移有序列号在begining,而不是时间戳,也有插件名称在迁移前缀。
就像这样:

--products_addon
----migrations
------001_products_migration.rb
--tools_addon
----migrations
------001_tools_migrations.rb

最后,我希望数据库中的schema_migrations表包含值:

"001_products_addon"
"001_tools_addon"

但是ActiveRecord似乎只是跳过与现有的前一次迁移具有相同序列号的任何迁移。当我使用一个MigrationContext用于多个目录迁移时,我会得到DuplicateMigrationError。当我使用不同的MigrationContext示例时,第二次迁移被跳过,没有解释或警告或错误。
也许我可以以某种方式强制每个迁移的版本的特定名称?

vm0i2vca

vm0i2vca1#

TL;DR;可以通过覆盖迁移的ActiveRecord类向迁移添加特定的后缀来完成。
默认情况下,你不能在普通的ActiveRecord中这样做。
首先,ActiveRecord接受迁移文件名开头带有整数值的迁移并对其进行排序。
在“旧”时代,ActiveRecord使用增量值,如“001_migration”,“002_migration”,“003_migration”等。
在某些时候,ActiveRecord的开发人员在迁移文件名的开头切换到了时间戳。
它解决了迁移前缀不明确的问题,这通常发生在几个开发人员在不同的VCS(版本控制系统)中工作时,如git,mercurial,subversion。2 devs push migrations“002_users”and“002_products”into the repository,in the“old”days ActiveRecord would notify about the ambigous migrations and maybe raise an exception,because it does not know which migrations should be applied to the database first).
现在,在迁移名称中添加时间戳,问题解决了。不太可能出现具有相同时间戳的多个迁移(这将需要2个以上开发人员的大量工作来及时同步,或者只需手动重命名迁移即可)
这里描述的行为类似于Redmine系统中的行为,其中每个插件都有其迁移的前缀。
你可以在这里找到Redmine的源代码:https://github.com/redmine/redmine
Redmine,在这个问题中有类似的方法,不关心前缀。但它确实关心插件名称。
Redmine的开发人员覆盖了ActiveRecord类,以便在创建迁移和将应用于数据库时添加twist - plugin后缀。
当为Redmine开发插件时,模板以“INCREMENTAL_INTEGER_plugin_name”的方式生成迁移。
当应用来自不同插件的迁移时-它们被写入“schema_migration”表(ActiveRecord内置表,用于存储有关已应用迁移的信息),并带有相应插件的后缀。
他们的方法比简单地覆盖几个方法(您可以检查它们的源代码)要复杂一些,他们覆盖检查应用迁移的方法,恢复它们等等。
但这是可行的。而且不是火箭科学。只要在他们的代码中遵循他们的经验步骤。

相关问题