Si usted es capaz de controlar y configurar cada Rails ejemplo, y que pueden permitirse el derroche de recursos a causa de ellos estar en modo de espera, ahorrar un poco de apuro y sólo cambia el database.yml para modificar la conexión de base de datos utilizada en cada instancia. Si le preocupa el rendimiento, este enfoque no lo reducirá.
Para los modelos con destino a una sola tabla única en una sola base de datos que puede llamar establish_connection dentro del modelo:
establish_connection "database_name_#{RAILS_ENV}"
Como se describe aquí: http://apidock.com/rails/ActiveRecord/Base/establish_connection/class
va a tener algunos modelos que utilizan las tablas de una base de datos y otros modelos diferentes que usan tablas de otras bases de datos.
Si tiene tablas idénticas, comunes en diferentes bases de datos y compartidas por un único modelo, ActiveRecord no lo ayudará. Allá por el año 2009 lo solicité en un proyecto en el que estaba trabajando, utilizando Rails 2.3.8. Tenía una base de datos para cada cliente y nombré las bases de datos con sus ID.Así que he creado un método para cambiar la conexión en el interior ApplicationController:
def change_database database_id = params[:company_id]
return if database_id.blank?
configuration = ActiveRecord::Base.connection.instance_eval { @config }.clone
configuration[:database] = "database_name_#{database_id}_#{RAILS_ENV}"
MultipleDatabaseModel.establish_connection configuration
end
y ha añadido que el método como before_filter a todos los controladores:
before_filter :change_database
Así, por cada acción de cada controlador, cuando params [ : company_id] está definido y configurado, cambiará la base de datos a la correcta.
Para manejar las migraciones extendí ActiveRecord :: Migración, con un método que busca todos los clientes y itera un bloque con cada ID:
class ActiveRecord::Migration
def self.using_databases *args
configuration = ActiveRecord::Base.connection.instance_eval { @config }
former_database = configuration[:database]
companies = args.blank? ? Company.all : Company.find(args)
companies.each do |company|
configuration[:database] = "database_name_#{company[:id]}_#{RAILS_ENV}"
ActiveRecord::Base.establish_connection configuration
yield self
end
configuration[:database] = former_database
ActiveRecord::Base.establish_connection configuration
end
end
Tenga en cuenta que al hacer esto, sería imposible para usted realizar consultas dentro de la misma acción desde dos bases de datos diferentes. Puede llamar al change_database nuevamente, pero se pondrá desagradable cuando intente usar métodos que ejecuten consultas, desde los objetos que ya no están vinculados a la base de datos correcta. Además, es obvio que no podrá unir tablas que pertenecen a diferentes bases de datos.
Para manejar esto correctamente, ActiveRecord debería extenderse considerablemente. Debería haber un complemento ahora para ayudarlo con este problema. Una investigación rápida me dio éste:
DB-Charmer: http://kovyrin.github.com/db-charmer/
estoy dispuesto a intentarlo. Déjame saber lo que funciona para ti.
http://imnithin.github.io/multiple-database.html – Nithin