如何在RubyonRails中动态更改所有模型的ActiveRecord数据库



在我们的程序中,每个客户都有自己的数据库。我们通过电子邮件向他们发送一个链接,将他们连接到数据库。链接包含一个GUID,让程序知道要连接到哪个数据库。

如何以动态和程序方式将ActiveRecord连接到正确的数据库?

您也可以轻松地做到这一点,而无需硬编码任何内容,并自动运行迁移:

customer = CustomerModel.find(id)
spec = CustomerModel.configurations[RAILS_ENV]
new_spec = spec.clone
new_spec["database"] = customer.database_name
ActiveRecord::Base.establish_connection(new_spec)
ActiveRecord::Migrator.migrate("db/migrate_data/", nil)

我发现在之后重新建立特定模型上的旧连接很有用:

CustomerModel.establish_connection(spec)

您可以随时通过调用ActiveRecord::Base.sestablish_connection(…)来更改与ActiveRecord的连接

IE:

 ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev",
    :username => "root", :password => "password" })

创建这个问题已经有一段时间了,但我不得不说还有另一种方法:

conn_config = ActiveRecord::Base.connection_config.to_h.deep_dup
conn_config[:database] = new_database
ActiveRecord::Base.establish_connection conn_config
class Database
  def self.development!
    ActiveRecord::Base.establish_connection(:development)
  end
  def self.production!
    ActiveRecord::Base.establish_connection(ENV['PRODUCTION_DATABASE'])
  end
  def self.staging!
    ActiveRecord::Base.establish_connection(ENV['STAGING_DATABASE'])
  end
end

.env中(例如dotenv-rails-gem):

PRODUCTION_DATABASE=postgres://...
STAGING_DATABASE=postgres://...

现在你可以:

Database.development!
User.count
Database.production!
User.count
Database.staging!
User.count
# etc.

相关内容

  • 没有找到相关文章

最新更新