2011-02-23 11 views
8

Estoy trabajando en una aplicación de múltiples bases de datos de Rails 3. Cada base de datos tiene un esquema diferente (y en producción se encuentran en diferentes ubicaciones). He creado la aplicación para hablar con diferentes bases de datos, así:Tareas de rastreos para múltiples bases de datos con esquemas diferentes

database.yml

development: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: main_development 
    pool: 5 
    username: someuser 
    password: somepassword 
    socket: /tmp/mysql.sock 

other_development: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: other_development 
    pool: 5 
    username: someuser 
    password: somepassword 
    socket: /tmp/mysql.sock 

modelos/other_base.rb

class OtherBase < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection "other_#{Rails.env}" 
end 

modelos/some_model.rb

class SomeModel < OtherBase 
    # Regular stuff here 
end 

Ahora, esto funciona bien para la aplicación web, pero no tan bien para ejecutar tareas de rake, incluidas las pruebas (los dispositivos no se cargan c orrectly). ¿Hay una gema disponible para esto? Cualquier ayuda apreciada.

Además, sería bueno crear un archivo schema.rb que podría manejar los diferentes esquemas para diferentes DBs, es decir, me permitiría hacer cosas como rake db: create o db: setup y hacer que cree múltiples bases de datos con el esquema específico de la base de datos.

+0

Proporcione más detalles sobre el error. Algunos resultados de registro o cuál es el error exacto. También pegue el código de tarea de rake que no funciona. – Zimbabao

Respuesta

0

Puede probar el plugin loopy multiple databases. Parece permitir la designación de diferentes configuraciones de rake fácilmente

+1

Desafortunadamente, el complemento ya no parece estar disponible. Las instrucciones para instalarlo involucran un servidor de subversión que ya no responde. –

1

Tuve el mismo problema, y ​​después de pasar media hora buscando el complemento 'loopy_multiple_database', finalmente llegué a la conclusión de que se había desvanecido de la web y recurrido al monkey-patching the Rails rake tasks . La única tarea que quería corregir es db:migrate, pero el mismo proceso (feo) también le permite parchar otras tareas.

En Los Carriles 3, agregue crear un archivo db_migrate_override.rake (cualquier nombre * .rake hará) en lib/tasks así:

Rake::TaskManager.class_eval do 
    def remove_task(task_name) 
    @tasks.delete(task_name.to_s) 
    end 
end 

def remove_task(task_name) 
    Rake.application.remove_task(task_name) 
end 

namespace :db do 
    remove_task 'db:migrate' 
    desc "Migrate the database (options: VERSION=x, SRCDIR=path, VERBOSE=false)." 
    task :migrate => :environment do 
    srcdir = (ENV["SRCDIR"] || "db/migrate/") 
    ActiveRecord::Migrator.migrate(srcdir, ENV["VERSION"] ? ENV["VERSION"].to_i : nil) 
    Rake::Task["db:schema:dump"].invoke if (ActiveRecord::Base.schema_format == :ruby && ENV['SRCDIR'].nil?) 
    end 
end 

continuación, puede ejecutar

rake db:migrate RAILS_ENV=other_development SRCDIR=db_other/migrate 
3

encuentro el uso de entornos un truco no aceptable en este caso. Desea tener dos bases de datos en el mismo entorno.

Mientras investigaba esa pregunta, me encontré con una esencia del usuario de github rafaelchiti. Lamentablemente eliminó la esencia original. Puede encontrar un copy of it here.

+0

Aceptaría esta respuesta si pudiera. Tendré que votar esto en cambio. – Ron

+0

El enlace está roto. – seancdavis

1

Puede probar el uso de octopus gem (https://github.com/thiagopradi/octopus), le ayuda a configurar múltiples bases de datos y es compatible con Rails 3.2 y Rails 4. Con esta joya puede especificar fácilmente la base de datos para la que desea ejecutar las migraciones.

Cuestiones relacionadas