Rails:将模式加载到辅助数据库中

时间:2014-01-10 22:30:18

标签: ruby-on-rails activerecord database-schema

如何将架构加载到辅助数据库?似乎在Rails中不支持在维护主ActiveRecord::Base.connection的情况下设置辅助数据库连接的能力。

域名定义

我们有使用辅助数据库的模型。我们的主数据库是MySQL,辅助数据库是PostgreSQL。要使用ActiveRecord文档的示例:

|
+-- Book
|    |
|    +-- ScaryBook
|    +-- GoodBook
+-- Author
+-- BankAccount

Book是抽象的,并使用establish_connection连接到Postgres。

在处理数据库时,我们可以使用ActiveRecord::Base.connectionBook.connection

架构转储

即便:Rails database tasks in the schema namespace允许我们转储架构,如下所示:

ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)

这将允许我执行以下操作:

ActiveRecord::SchemaDumper.dump(Book.connection, file)

问题:架构加载

但是,加载任务不具备此功能。它只是作为一个整体评估模式文件:

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的情况下更改“当前连接适配器”,这不是我想要做的?我基本上希望在ActiveRecord::Schema.define

的上下文中运行Book.connection

编辑:我会注意到我需要一个运行rake任务的 的程序化解决方案,这就是为什么我在的rake任务中查看以查看它们是什么实际上是在做。

2 个答案:

答案 0 :(得分:1)

如何转储架构:

ActiveRecord::Base.establish_connection "custom_db_#{Rails.env}".to_sym 
File.open Rails.root.join('db/schema_custom_db.rb'), 'w:utf-8' do |file| 
  ActiveRecord::SchemaDumper.dump ActiveRecord::Base.connection, file
end

如何加载架构:

ActiveRecord::Tasks::DatabaseTasks.load_schema_current :ruby, Rails.root.join('db/schema_custom_db.rb'), "custom_db_#{Rails.env}"

答案 1 :(得分:0)

我最近一直在努力尝试使用ActiveRecord。我可以加载迁移和转储模式,但是当涉及到加载模式时,我遇到了类似的问题而且它不是Rails或Rake。仅供参考。 我知道你不想这样做,但我正在努力。

请注意看这篇文章: rake db:schema:load vs. migrations

我仍然沉迷于尝试在没有Rails或Rake帮助的情况下独自完成它,以便我更好地了解ActiveRecord的工作原理。

我制作了一个非常小的Rails结构,只是为了生成迁移。

文件结构:

Rakefile
Gemfile
/bin
  bundle
  rake
  rails
/config
  application.rb
  boot.rb
  database.yml
  environment.rb
/db
  /migrate
  development.sqlite3
  schema.rb

  bin/rails generate migration CreateSystemSettings

我在db / migrate文件夹中得到一个文件20150207170924_create_system_settings.rb。

  bin/rake db:migrate

== 20150204070000 DropArticles: migrating 
== 20150204070000 DropArticles: migrated (0.0001s)
== 20150207163123 AddPartNumberToProducts: migrating 
== 20150207163123 AddPartNumberToProducts: migrated (0.0000s) 
== 20150207163909 ChangeSystemSettings: migrating 
== 20150207163909 ChangeSystemSettings: migrated (0.0000s) 
== 20150207170924 CreateSystemSettings: migrating 
-- create_table(:system_settings)
-> 0.0085s
== 20150207170924 CreateSystemSettings: migrated (0.0199s) 

这样才有效

更新待处理