通过引擎

时间:2017-10-11 23:43:06

标签: ruby-on-rails rails-migrations rails-engines

我有一个rails应用程序,通过在Gemfile中明确声明它来运行rails引擎。我设置了一个脚本来通过以下方式从引擎安装迁移:rake railties:install:migrations然后进行迁移。当我运行脚本时,会安装迁移,但是当迁移运行时,我会收到DuplicateMigration错误。我进一步调查了这个并看到了

Rails.application.paths['db/migrate'].to_a
导致:

["/src/db/migrate","/bundle/bundler/gems/my_engine-w8ejw9jf/db/migrate"]

以某种方式,捆绑目录的迁移路径将被添加到Rails应用程序路径中。这发生在哪里?有没有办法可以阻止我的bundle目录中的迁移路径被包含在应用程序路径中?

1 个答案:

答案 0 :(得分:0)

好的,我做了一些挖掘,事实证明这实际上是在引擎本身完成的。在engine.rb文件中,有一些逻辑可以更改自动加载的路径。核心逻辑如下:

 class Engine < ::Rails::Engine
   isolate_namespace MyEngine

   initializer :append_migrations do |app|
     unless app.root.to_s.match root.to_s
       config.paths["db/migrate"].expanded.each do |expanded_path|
         app.config.paths["db/migrate"] << expanded_path
       end
     end
   end
end

这是采用迁移文件的扩展路径,并将它们推送到路径配置中。这就是我在路径配置中看到/bundle/bundler/gems/mycoolgem-w8ejw9jf/db/migrate的原因。

相关问题