4

我想rake db:schema:load使用db/schema.rb不在我的应用程序中,但在我的一个宝石中的。这已经可以db:seed通过放入config.paths['db/seeds'] = Core::Engine.paths['db/seeds'].existent我的application.rb. (Core 是一个 gem,也是一个 Rails 引擎)。

但是,没有db/schema.rb路径进入config.pathsconfig.paths['db'] = Core::Engine.paths['db'].existent也没有效果。

完成这项工作的最简单方法是什么?

4

5 回答 5

5

对于任何偶然发现这一点的人,从 Rails 4.0 开始,您可以在引擎配置中设置“db”键,主应用程序将在那里查找您的模式。

active_record/railties/databases.rake

module MyEngine
  class Engine < ::Rails::Engine
    initializer :override_db_dir do |app|
      app.config.paths["db"] = config.paths['db'].expanded
    end
  end
end
于 2015-08-27T20:10:16.877 回答
4

根据 Rails 3.2 源代码https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/railties/databases.rake#L400,设置 SCHEMA 环境变量应该有帮助:

ENV['SCHEMA'] = Core::Engine.paths['db'].existent

我记得,Rails 4 中的数据库任务发生了显着变化,因此这种方法不一定适用于 Rails 4。

另一种选择是在您的 gem 中覆盖 rake 任务本身。

于 2013-03-29T13:46:01.380 回答
2

您可以从您的 gem 获取迁移 - rake gem_name:install:migrations

于 2013-03-19T11:45:13.063 回答
1

为什么不使用自定义 rake 任务?

desc 'Load a custom.rb file into the database'
  task :load_default_schema do
    file = ENV['SCHEMA'] || "path_to_your_file"
    if File.exists?(file)
      load(file)
    else
      abort %{#{file} doesn't exist yet.}
    end
  end
于 2013-03-31T15:22:48.490 回答
0

虽然不完全一样,但您可以执行以下操作以使 gem 中的迁移就像它们是应用程序的一部分一样。我发现这是一个更优雅的解决方案,而不是尝试共享模式。我希望这有帮助。

Rails 引擎中的迁移?

于 2013-03-31T19:54:22.157 回答