ruby-on-rails - software - ruby on rails tutorial español
Conexión de Rails 3.1 con múltiples bases de datos (6)
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 rieles 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 here , here y here ), 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!
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
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.
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://.com/a/16542724/1447654
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}"