我希望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
无效。
完成这项工作的最简单方法是什么?
答案 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中进行迁移,就像它们是应用程序的一部分一样。我发现这是一个更优雅的解决方案,而不是尝试共享架构。我希望这会有所帮助。