Как я могу динамически изменять базу данных Active Record для всех моделей в Ruby on Rails?
В нашей программе каждый клиент получает свою собственную базу данных. Мы отправляем им по электронной почте ссылку, которая связывает их с их базой данных. Ссылка содержит GUID, который позволяет программе узнать, к какой базе данных подключиться.
Как я динамически и программно подключаю ActiveRecord к правой db?
Ответы
Ответ 1
Вы также можете легко это сделать, ничего не программируя и автоматически запустив миграцию:
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(new_spec)
Ответ 2
вы можете в любое время изменить соединение с ActiveRecord, вызвав ActiveRecord:: Base.establish_connection (...)
IE:
ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev",
:username => "root", :password => "password" })
Ответ 3
Прошло некоторое время, так как этот вопрос был создан, но я должен сказать, что есть и другой способ:
conn_config = ActiveRecord::Base.connection_config
conn_config[:database] = new_database
ActiveRecord::Base.establish_connection conn_config
Ответ 4
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.