使用模式.宝石中的Rb



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

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

做这件事最简单的方法是什么?

对于那些偶然发现这一点的人来说,从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

根据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 gem_name:install:migrations

为什么不使用自定义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

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

Rails引擎中的迁移?

最新更新