我希望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引擎中的迁移?