2008-10-03 10 views
5

Tengo dos bases de datos con la misma estructura. Las tablas tienen un número entero como clave principal tal como se usa en Rails.Bases de datos de Merging Rails

Si tengo una tabla de pacientes, tendré un paciente usando la clave principal 123 en una base de datos y otro paciente usando la misma clave primaria en la otra base de datos.

¿Qué sugeriría para fusionar los datos de ambas bases de datos?

+0

¿Qué motor de base de datos está utilizando? Además (no tengo mucha experiencia en Rails), ¿asigna Rails los identificadores para nuevos registros o lo hace el motor de la base de datos? – Neall

+0

En Rails, los ids son asignados por la base de datos utilizando un tipo de campo entero de secuencia o autoincrement. – hectorsq

Respuesta

10

Establezca ambas bases de datos con entradas en config/database.yml, luego genere una nueva migración.

uso de ActiveRecord :: Base.establish_connection para cambiar entre las dos bases de datos en la migración de esta manera:

def self.up 
    ActiveRecord::Base.establish_connection :development 
    patients = Patient.find(:all) 
    ActiveRecord::Base.establish_connection :production 
    patients.each { |patient| Patient.create patient.attributes.except("id") } 
end 

tu caso es distinto en función del número de registros y las asociaciones entre los modelos.

+0

Me enfrento al problema cuando cambié la base de datos del desarrollo a la producción, luego la variable de registros de pacientes se actualizó. Por ejemplo, tengo 10 usuarios en desarrollo y 3 en producción cuando cambié de base de datos la variable de pacientes convertida de 10 usuarios a 3. ¿Pueden ayudarme? :) –

0

Por cierto, tiene más sentido que esto sea una tarea de rastrillo o capistrano en lugar de una migración.

5

Si sus bases de datos son exactamente los mismos (los datos no requiere un tratamiento personalizado) y no hay demasiados registros, usted puede hacer esto (que permite las claves externas):

No comprobado .. . pero se entiende la idea

#All models and their foreign keys 
tales = {Patients => [:doctor_id, :hospital_id], 
     Doctors => [:hospital_id], 
     Hospitals} 

ActiveRecord::Base.establish_connection :development 

max_id = tables.map do |model| 
    model.maximum(:id) 
end.max + 1000 


tables.each do |model, fks| 
    ActiveRecord::Base.establish_connection :development 
    records = model.find(:all) 

    ActiveRecord::Base.establish_connection :production 
    records.each do |record| 
    #update the foreign keys 
    fks.each do |attr| 
     record[attr] += max_id if not record[attr].nil? 
    end 
    record.id += max_id 

    model.create record.attributes 
    end 
end 

Si usted tiene un montón de discos puede que tenga que parte de esto de alguna manera ... hacerlo en grupos de 10k o algo así.

Cuestiones relacionadas