relations references rails migrations guide generate create ruby-on-rails database activerecord

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.