ruby-on-rails - migrations - reset db rails
Bases de datos de Merging Rails (3)
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.
Si tengo una tabla de pacientes, tendré un paciente usando la clave primaria 123 en una base de datos y otro paciente usando la misma clave primaria en la otra base de datos.
¿Qué sugieres para fusionar los datos de ambas bases de datos?
Establezca ambas bases de datos con entradas en config / database.yml, luego genere una nueva migración.
Utilice ActiveRecord :: Base.establish_connection para alternar 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
YMMV según la cantidad de registros y las asociaciones entre modelos.
Por cierto, tiene más sentido que esto sea una tarea de rake o capistrano en lugar de una migración.
Si sus bases de datos son exactamente iguales (los datos no requieren procesamiento personalizado) y no hay demasiados registros, puede hacerlo (lo que permite las claves externas):
No probado ... Pero entiendes 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 tiene MUCHOS registros, puede que tenga que dividirlos de alguna manera ... hágalo en grupos de 10k o algo así.