references - ¿Cómo puedo cambiar dinámicamente la base de datos Active Record para todos los modelos en Ruby on Rails?
rails guide relations (4)
En nuestro programa, cada cliente obtiene su propia base de datos. Les enviamos por correo electrónico un enlace que los conecta a su base de datos. El enlace contiene un GUID que le permite al programa saber a qué base de datos conectarse.
¿Cómo conecto ActiveRecord de forma dinámica y programática con el db correcto?
Ha pasado un tiempo desde que se creó esta pregunta, pero debo decir que también hay otra forma:
conn_config = ActiveRecord::Base.connection_config
conn_config[:database] = new_database
ActiveRecord::Base.establish_connection conn_config
También puede hacer esto fácilmente sin tener que codificar nada y ejecutar migraciones automáticamente:
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)
Me resulta útil restablecer la conexión anterior en un modelo particular después:
CustomerModel.establish_connection(RAILS_ENV)
puede cambiar la conexión a ActiveRecord en cualquier momento llamando a ActiveRecord :: Base.establish_connection (...)
ES DECIR:
ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev",
:username => "root", :password => "password" })
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
Y en .env
(con dotenv-rails
gem por ejemplo):
PRODUCTION_DATABASE=postgres://...
STAGING_DATABASE=postgres://...
Y ahora puedes:
Database.development!
User.count
Database.production!
User.count
Database.staging!
User.count
# etc.