我有一个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目录中的迁移路径被包含在应用程序路径中?
答案 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
的原因。