Ruby on rails 在gem中使用schema.rb

Ruby on rails 在gem中使用schema.rb,ruby-on-rails,ruby,rake,Ruby On Rails,Ruby,Rake,我想rake db:schema:load使用一个db/schema.rb它不在我的应用程序中,而是在我的一个gem中。这已经适用于db:seed,方法是将config.paths['db/seeds']=Core::Engine.paths['db/seeds'].existence放在我的application.rb中。(Core是一个gem,也是一个Rails引擎) 但是,在config.paths和config.paths['db']=Core::Engine.paths['db']中没

我想
rake db:schema:load
使用一个
db/schema.rb
它不在我的应用程序中,而是在我的一个gem中。这已经适用于
db:seed
,方法是将
config.paths['db/seeds']=Core::Engine.paths['db/seeds'].existence
放在我的
application.rb
中。(Core是一个gem,也是一个Rails引擎)

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


最简单的方法是什么?

您可以从gem-rake gem_name:install:migrations获得迁移根据Rails 3.2源代码,设置SCHEMA env变量应有助于:

ENV['SCHEMA'] = Core::Engine.paths['db'].existent
正如我所记得的,数据库任务在Rails 4中已经发生了显著的变化,因此这种方法在Rails 4中不一定有效


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

为什么不使用自定义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 4.0开始,您可以在引擎配置中设置“db”键,主应用程序将在那里查找您的模式

模块MyEngine
类引擎<::Rails::引擎
初始值设定项:override_db_dir do|app|
app.config.paths[“db”]=config.paths['db'].已扩展
结束
结束
结束

因为我有4个应用程序都使用相同的型号,我希望所有应用程序都具有相同的模式和迁移。我不知道,但这不是我想要的,我希望gem中的schema.rb。这很有效,谢谢!我使用了
ENV['SCHEMA']=Core::Engine.path['db'].existence.first+“/SCHEMA.rb”
module MyEngine
  class Engine < ::Rails::Engine
    initializer :override_db_dir do |app|
      app.config.paths["db"] = config.paths['db'].expanded
    end
  end
end