Rails 5.0.0.beta1,两个数据库设置创建了额外的active_record_internal_metadatas表

时间:2016-01-12 16:03:56

标签: mysql ruby-on-rails ruby database ruby-on-rails-5

我正在尝试在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
    

1 个答案:

答案 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