我正在尝试在rails 5.0.0.beta1
中实现两个数据库设置。一切似乎都很好,但我遇到了一些奇怪的事情。模型连接到指定的数据库,关联工作,迁移(经过一些调整)也可以正常工作。运行迁移后,在两个数据库中都会出现另一个名为active_record_internal_metadatas
的表。当我在rails 4.2.5
上测试此设置时,没有这样的事情。有人可以对这个问题有所了解吗?
双数据库设置的设置:
database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password:
socket: /tmp/mysql.sock
development:
<<: *default
database: app_name_development_first
development_second:
<<: *default
database: app_name_development_second
second_db_connection.rb
- 处理与第二个数据库的连接的模型。应该在第二个数据库中的所有模型都必须继承此模型。
class SecondDbConnection < ActiveRecord::Base
establish_connection "#{Rails.env}_second".to_sym
self.abstract_class = true
end
application_controller.rb
- 缓存第二个数据库的连接
class ApplicationController < ActionController::API
around_filter :cache_other_db_connections
private
def cache_other_db_connections
SecondDbConnection.connection.cache { yield }
end
end
db.rake
- 覆盖迁移任务
namespace :db do
task :migrate do
Rake::Task['db:migrate_first'].invoke
Rake::Task['db:migrate_second'].invoke
end
task :migrate_first do
ActiveRecord::Base.establish_connection ("#{Rails.env}".to_sym)
ActiveRecord::Migrator.migrate('db/db_first/migrate/')
ActiveRecord::Base.connection.close
end
task :migrate_second do
ActiveRecord::Base.establish_connection ("#{Rails.env}_second".to_sym)
ActiveRecord::Migrator.migrate('db/db_second/migrate/')
ActiveRecord::Base.connection.close
end
end
答案 0 :(得分:0)
它似乎是一个Rails 5功能。以下是this pull request commit引用它的引文:
防止对生产数据库采取破坏性行动
这个PR介绍了一个 键/值类型存储到可用于存储的Active Record 内部价值观。它是#21237 cc的替代实现 @sgrif @matthewd。
可以通过以下方式对生产数据库运行测试 现在发生事故。尽管很少,但作为轶事数据 此外,Heroku收到了一些非常重要的数据库请求 由于这种情况而恢复。在这些情况下,损失可能很大。
为了防止针对生产运行测试,我们可以存储 在a中迁移数据库时使用的“environment”版本 新内部表。在执行测试之前,我们可以查看数据库 是
protected_environments
中列出并中止。有手册 逃生阀强制进行这种检查与环境发生 变量DISABLE_DATABASE_ENVIRONMENT_CHECK=1
。