在gem中使用schema.rb

时间:2013-03-19 11:23:58

标签: ruby-on-rails ruby rake

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

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

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

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

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

我记得,Rails 4中的数据库任务已经发生了很大的变化,因此这种方法在Rails 4中并不一定有效。

另一种选择是在宝石中覆盖rake任务本身。

答案 2 :(得分:2)

您可以从gem-rake gem_name:install:migrations

进行迁移

答案 3 :(得分: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

答案 4 :(得分:0)

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

Migrations in Rails Engine?