覆盖用于在Rails 4中创建表的默认ActiveRecord迁移

时间:2014-08-17 10:19:37

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord rails-migrations

在我们现有的Rails 3应用程序中,我们使用重写的migration.rb文件来自定义表创建行为。

这是在Rails 3中通过将我们的自定义文件放在lib/templates/active_record/model/migration.rb中完成的,但是看起来Rails 4已经更改了用于这些模板的位置,并且此覆盖不再被拾取(它使用了创建表时默认的ActiveRecord迁移。)

我已经浏览了4.1 ActiveRecord代码,但无法再次使用覆盖。

是否有人知道将自定义migration.rb放入Rails 4代码库的正确位置?

编辑澄清

在Rails中创建新模型时,为您生成的迁移基于Rails gem中(> 4.1.x)activerecord/lib/rails/generators/active_record/migration/templates/create_table_migration.rb中找到的模板。

自Rails 3.2以来,这已经发生了变化。在Rails 3.2中,使用的模板名为migration.rb,位于Rails gemactiverecord/lib/rails/generators/active_record/model/templates目录中。

为了自定义生成的模板(添加将在change方法中执行的自定义SQL块),我们通过将其修改后的副本放在{的{}下的本地代码库中来覆盖此文件。 {1}}目录。

我们对其进行自定义,以便在迁移结束时添加一些特定于应用程序的SQL。在rails 3中,这意味着无论何时生成新模型,生成的迁移都会在迁移结束时自动包含我们的自定义SQL。

在我们的Rails 4升级中,此自定义迁移不再被使用,因此我们获取了rails生成的vanilla迁移文件,并且每次都必须手动添加SQL。

我尝试遵循相同的约定并将文件放在lib/templates/active_record/model(以及其他各种位置)中,但Rails在生成迁移时没有使用自定义模板。

2 个答案:

答案 0 :(得分:2)

在Rails 4.2.6中,这些路径是这样的:

lib/templates/active_record/migration/migration.rb
lib/templates/migration/templates/create_table_migration.rb

这个问题的最终答案是查看Thor库的源代码,因为所有的rails生成器都是基于它的。这就是我找到正确路径的方式。

转到lib/thor/actions.rb文件并查找find_in_source_paths方法,然后在其中添加puts语句。无论何时运行任何生成器,您都可以看到搜索模板的所有路径的列表。还有其他方法,但这应该给你一个想法。

答案 1 :(得分:0)

在Rails 4.1.4中,这应该放在这里:

activerecord/lib/active_record/migration.rb

来源:

http://api.rubyonrails.org/files/activerecord/lib/active_record/migration_rb.html