多个数据库连接:在错误的数据库中查找schema_migrations

Ami*_*itA 8 migration activerecord ruby-on-rails ruby-on-rails-3

我试图通过以下方式为我的一些迁移使用辅助数据库连接:

# app/models/staging/migration.rb
class Staging::Migration < ActiveRecord::Migration
    def self.connection
        ActiveRecord::Base.establish_connection(:staging_db).connection
    end
end

# db/migrate/<timestamp>_create_foo.rb
class CreateFoo < Staging::Migration
    ....
end
Run Code Online (Sandbox Code Playgroud)

在我的database.yml中配置了staging_db连接.

当我运行rake db:migrate时,表foo在staging_db模式中正确创建,表schema_migrations在RAILS_ENV =开发连接中创建.但是db:migrate报告以下错误(后续迁移失败):

表'staging_db.schema_migrations'不存在

有没有办法告诉Staging :: Migration在当前的RAILS_ENV连接中查找schema_migrations表?

顺便说一下,我知道staging_db不是RAILS_ENV感知的事实.这对我来说很好,因为每个服务器都通过一个单独的database.yml来配置它的环境,而这个数据库不在我的仓库中.

Sch*_*rfy 0

我已经这样做了,但在 Rails 之外,它在 Rails 中应该没有太大不同,这是我的做法:

第一件事是在执行迁移之前连接数据库,在 Rails 中最好的位置可能是在初始化程序中:

MyModel.establish_connection({
  :adapter => "mysql2",
  :database => "mydb",
  :username => "root",
  :encoding => 'utf8'
})
Run Code Online (Sandbox Code Playgroud)

哈希值通常会从 yml 文件加载,但这就是您最终想要的结果。
如果此数据库中有多个模型,MyModel 可以是抽象类。

接下来在迁移中,当您想要迁移此数据库时,您只需执行以下操作:

class DoDomething < ActiveRecord::Migration
  def self.connection
    MyModel.connection
  end

  def self.up
    add_column [...]
  end
end
Run Code Online (Sandbox Code Playgroud)

以这种方式执行操作时需要注意的一件事是,只有一个 schema_migrations 表,并且它将位于“主”数据库中。