Conexión de Rails 3.1 con múltiples bases de datos

En ShowNearby hemos estado haciendo una gran migración a RoR 3.1 desde PHP y enfrentamos varios problemas que algunos de ustedes ya han resuelto.

Tenemos grandes cantidades de datos y decidimos segregar nuestro DB en varios DB que podemos manejar por separado. Por ejemplo, nuestras cuentas, lugares, registros y otros se dividen en varias bases de datos

Necesitamos migraciones, accesorios, modelos, para jugar bien, y hasta ahora ha sido bastante desordenado. Algunos de nuestros requisitos para que una solución sea aceptable:

  • un modelo debe relacionarse con una tabla en una de las bases de datos.
  • rake db: drop – debería eliminar todo el env de la base de datos que especifiquemos en database.yml
  • rake db: create – debería crear todos los env de la base de datos que especifiquemos en database.yml
  • rake db: migrate – debería ejecutar migraciones a las diversas bases de datos
  • rake db: test – debe tomar los accesorios y soltarlos en las diversas bases de datos y probar la unidad / función / etc.

Estamos considerando establecer proyectos de Rails por cada base de datos y conectarlos con ActiveResource, pero creemos que esto no es muy eficiente. ¿Alguno de ustedes ha lidiado con un problema similar antes?

¡¡Muchas gracias!!

A la respuesta de Wukerplank, también puede poner los detalles de la conexión en database.yml como de costumbre con un nombre como ese:

log_database_production: adapter: mysql host: other_host username: logmein password: supersecret database: logs 

Luego en tu modelo especial:

 class AccessLog < ActiveRecord::Base establish_connection "log_database_#{Rails.env}".to_sym end 

Para evitar que esas molestas credenciales estén en el código de tu aplicación.

Editar: si desea reutilizar esta conexión en varios modelos, debe crear una nueva clase abstracta y heredar de ella, porque las conexiones están estrechamente relacionadas con las clases (como se explica aquí , aquí y aquí ), y se crearán nuevas conexiones para cada clase.

Si ese es el caso, configure las cosas de la siguiente manera:

 class LogDatabase < ActiveRecord::Base self.abstract_class = true establish_connection "log_database_#{Rails.env}".to_sym end class AccessLog < LogDatabase end class CheckoutLog < LogDatabase end 

Conectarse a diferentes bases de datos es bastante fácil:

 # model in the "default" database from database.yml class Person < ActiveRecord::Base # ... your stuff here end # model in a different database class Place < ActiveRecord::Base establish_connection ( :adapter => "mysql", :host => "other_host", :username => "username", :password => "password", :database => "other_db" ) end 

Sería cauteloso al configurar varios proyectos de Rails ya que agregará una gran cantidad de sobrecarga a la recuperación de datos para sus controladores, lo que podría hacer que las cosas vayan más despacio.

En cuanto a sus preguntas sobre migraciones, accesorios, modelos, etc .: No creo que haya una manera fácil, así que publique preguntas separadas y sea lo más específico posible.

¿Consolidar los DB en uno no es una opción? ¡Haría tu vida mucho más fácil!

Encontré una gran publicación que señalará a los demás la forma correcta de hacer esto. http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html

Configúralo de la siguiente manera:

database.yml (archivo de configuración db)

 support_development: adapter: blah database: blah username: blah password: blah 

support_base.rb (un archivo de modelo)

 class SupportBase < ActiveRecord::Base self.abstract_class = true #important! establish_connection("support_development") end 

tst_test.rb (un archivo de modelo)

 class TstTest < SupportBase #SupportBase not ActiveRecord is important! self.table_name = 'tst_test' def self.get_test_name(id) if id = nil return '' else query = "select tst_name from tst_test where tst_id = \'#{id}\'" tst = connection.select_all(query) #select_all is important! return tst[0].fetch('tst_name') end end end 

PD, esto realmente no cubre las migraciones, no creo que puedas hacer migraciones en más de un DB con rake (aunque no estoy seguro de que sea un 'no puedo hacer' lo difícil, es posible). Esta fue una excelente forma de conectarse y consultar otras bases de datos que no controlas.

También es posible que desee agregar el entorno Rails, por lo que las bases de datos de desarrollo y prueba no son las mismas.

 establish_connection "legacy_#{Rails.env}" 

El siguiente artículo sugiere definir nuevas tareas de Rake para lograr migraciones contra múltiples bases de datos. Cada tarea establece su propia conexión y luego ejecuta la migración con esta conexión y la carpeta de base de datos específica.

También define un db:migrate familiar db:migrate que llama a las otras dos tareas.

Incluyendo aquí en caso de que el enlace no esté disponible:

 desc "Migrate the database through scripts in db/migrate directory." namespace :db do task :migrate do Rake::Task["db:migrate_db1"].invoke Rake::Task["db:migrate_db2"].invoke end task :migrate_db1 do ActiveRecord::Base.establish_connection DB1_CONF ActiveRecord::Migrator.migrate("db/migrate/db1/") end task :migrate_db2 do ActiveRecord::Base.establish_connection DB2_CONF ActiveRecord::Migrator.migrate("db/migrate/db2/") end end 

Fuente: Ruby on Rails Conéctese a múltiples bases de datos y migraciones

Oye, esta publicación es antigua, pero encontré una solución que funciona en Rails 3.2 que podría ayudar a otra persona. https://stackoverflow.com/a/16542724/1447654