【发布时间】:2008-10-07 20:49:14
【问题描述】:
在我们的程序中,每个客户都有自己的数据库。我们通过电子邮件向他们发送一个链接,将他们连接到他们的数据库。该链接包含一个 GUID,让程序知道要连接到哪个数据库。
如何以编程方式将 ActiveRecord 动态连接到正确的数据库?
【问题讨论】:
标签: ruby-on-rails database activerecord
在我们的程序中,每个客户都有自己的数据库。我们通过电子邮件向他们发送一个链接,将他们连接到他们的数据库。该链接包含一个 GUID,让程序知道要连接到哪个数据库。
如何以编程方式将 ActiveRecord 动态连接到正确的数据库?
【问题讨论】:
标签: ruby-on-rails database 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.establish_connection(...) 更改与 ActiveRecord 的连接
IE:
ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev",
:username => "root", :password => "password" })
【讨论】:
这个问题已经有一段时间了,但我不得不说还有另一种方法:
conn_config = ActiveRecord::Base.connection_config
conn_config[:database] = new_database
ActiveRecord::Base.establish_connection conn_config
【讨论】:
ActiveRecord::Base.establish_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
在.env 中(例如dotenv-rails gem):
PRODUCTION_DATABASE=postgres://...
STAGING_DATABASE=postgres://...
现在你可以:
Database.development!
User.count
Database.production!
User.count
Database.staging!
User.count
# etc.
【讨论】: