Ruby on rails 如何动态更改RubyonRails中所有模型的活动记录数据库?

Ruby on rails 如何动态更改RubyonRails中所有模型的活动记录数据库?,ruby-on-rails,database,activerecord,Ruby On Rails,Database,Activerecord,在我们的程序中,每个客户都有自己的数据库。我们通过电子邮件向他们发送链接,将他们连接到他们的数据库。该链接包含一个GUID,用于让程序知道要连接到哪个数据库 如何以动态和编程方式将ActiveRecord连接到正确的数据库?您可以随时通过调用ActiveRecord::Base来更改与ActiveRecord的连接。建立\u连接(…) 即: 您还可以轻松完成此操作,而无需硬编码任何内容,并自动运行迁移: customer = CustomerModel.find(id) spec = Custo

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


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

您可以随时通过调用ActiveRecord::Base来更改与ActiveRecord的连接。建立\u连接(…)

即:


您还可以轻松完成此操作,而无需硬编码任何内容,并自动运行迁移:

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)

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

conn_config = ActiveRecord::Base.connection_config
conn_config[:database] = new_database
ActiveRecord::Base.establish_connection conn_config
.env
中(例如使用
dotenv-rails
gem):

现在你可以:

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

请注意,这将清除缓存-因此它将为每个表执行“显示类似%eachtable%的表”和“显示创建表”。只有当你在每个请求上建立新连接时才有问题……这救了我的命!非常简单的答案!如何更改connstring而不影响另一个池?我可能错了,但我几乎可以肯定
ActiveRecord::Base.build\u connection
会创建一个新池。如果你有一个特定的问题,你会有更多的好处打开一个新的问题。
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
PRODUCTION_DATABASE=postgres://...
STAGING_DATABASE=postgres://...
Database.development!
User.count
Database.production!
User.count
Database.staging!
User.count
# etc.