我有一个 rails 应用程序,它通过在 Gemfile 中显式声明来运行 rails 引擎。我设置了一个脚本来通过以下方式安装来自引擎的迁移:rake railties:install:migrations
然后迁移。当我运行脚本时,迁移已安装,但是当迁移运行时,我收到重复迁移错误。我进一步调查了这一点,发现
Rails.application.paths['db/migrate'].to_a
结果是:
["/src/db/migrate","/bundle/bundler/gems/my_engine-w8ejw9jf/db/migrate"]
不知何故,来自捆绑目录的迁移路径被添加到 Rails 应用程序路径中。这是在哪里发生的?有没有办法防止我的捆绑目录中的迁移路径包含在应用程序路径中?
我做了更多的挖掘,事实证明这实际上是在引擎本身中完成的。在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
的原因。