【发布时间】:2014-01-30 02:18:24
【问题描述】:
如何将架构加载到辅助数据库中? Rails 似乎不支持设置辅助数据库连接同时维护主要ActiveRecord::Base.connection 的能力。
域定义
我们有使用辅助数据库的模型。我们的主数据库是 MySQL,辅助数据库是 PostgreSQL。要使用 ActiveRecord 文档的示例:
|
+-- Book
| |
| +-- ScaryBook
| +-- GoodBook
+-- Author
+-- BankAccount
Book 是抽象的,使用establish_connection 连接到 Postgres。
在处理数据库时,我们可以使用ActiveRecord::Base.connection或Book.connection。
架构转储
也就是说:Rails database tasks in the schema namespace 允许我们像这样转储架构:
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
这将允许我执行以下操作:
ActiveRecord::SchemaDumper.dump(Book.connection, file)
问题:架构加载
但是,load 任务没有这种能力。它只是对整个架构文件进行评估:
desc 'Load a schema.rb file into the database'
task :load => :environment do
file = ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb"
if File.exists?(file)
load(file)
else
abort %{#{file} doesn't exist yet. Run "rake db:migrate" to create it then try again. If you do not intend to use a database, you should instead alter #{Rails.root}/config/application.rb to limit the frameworks that will be loaded}
end
end
架构文件在没有连接定义的情况下运行ActiveRecord::Schema.define。 (注意the define method 在“当前连接适配器”的上下文中运行)。
如何在不执行临时ActiveRecord::Base.establish_connection 的情况下更改“当前连接适配器”,这不是我想要做的?我基本上想在Book.connection 的上下文中运行ActiveRecord::Schema.define。
编辑:我会注意到我需要一个程序化解决方案在运行 rake 任务之外,这就是为什么我在 在 rake 任务中查看它们的原因'实际上在做。
【问题讨论】:
-
我相信此链接中提供的答案可能会有所帮助:[Switching connection on ActiveRecord::Schema][1] [1]: stackoverflow.com/questions/4743007/…
标签: ruby-on-rails activerecord database-schema