2008-10-03 7 views
5

Ich habe zwei Datenbanken mit der gleichen Struktur. Die Tabellen haben eine Ganzzahl als Primärschlüssel, wie sie in Rails verwendet wird.Rails-Datenbanken zusammenführen

Wenn ich eine Patiententabelle habe, wird ein Patient den Primärschlüssel 123 in einer Datenbank und ein anderer Patient den gleichen Primärschlüssel in der anderen Datenbank verwenden.

Was würden Sie vorschlagen, um die Daten aus beiden Datenbanken zusammenzuführen?

+0

Welche Datenbank-Engine verwenden Sie? Auch (ich habe nicht viel Erfahrung Rails), vergibt Rails die IDs für neue Datensätze oder tut es die Datenbank-Engine? – Neall

+0

In Rails werden die IDs von der Datenbank mithilfe eines Ganzzahl-Feldtyps sequenz oder autoincrement zugewiesen. – hectorsq

Antwort

10

Legen Sie beide Datenbanken mit den Einträgen in config/database.yml fest und generieren Sie eine neue Migration.

Verwenden Active :: Base.establish_connection zwischen den beiden Datenbanken in der Migration wie folgt wechseln:

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 auf der Anzahl der Datensätze und die Verbände zwischen den Modellen abhängig.

+0

Ich stehe vor dem Problem, wenn ich Datenbank von der Entwicklung zur Produktion wechselte, dann aktualisiert die Aufzeichnungen auf Patienten Variable. z. B. habe ich 10 Benutzer in der Entwicklung und 3 in der Produktion, als ich Datenbank die Patientenvariable änderte, die von 10 Benutzern zu 3 umgewandelt wurde. Können Sie bitte helfen. :) –

0

Übrigens ist es wahrscheinlich sinnvoller, dass dies eine Rake- oder Capistrano-Aufgabe ist, als eine Migration.

5

Wenn Ihre Datenbanken genau die gleichen (die Daten erfordert keine individuelle Verarbeitung) und es gibt nicht zu viele Datensätze, können Sie dies tun (was für Fremdschlüssel erlaubt):

Ungeprüfte ..

#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 

Wenn Sie eine Menge von Datensätzen haben Sie vielleicht irgendwie dieses heraus Teil haben ... tun sie in Gruppen von 10k oder so etwas. Aber Sie bekommen die Idee.