2008-10-03 37 views
5

我有兩個具有相同結構的數據庫。這些表有一個整數作爲Rails中使用的主鍵。合併Rails數據庫

如果我有一個患者表,我將有一個患者在一個數據庫中使用主鍵123,另一個患者在另一個數據庫中使用相同的主鍵。

對於合併來自兩個數據庫的數據,您有什麼建議?

+0

您使用的是什麼數據庫引擎?另外(我沒有太多的Rails經驗),Rails是否將新記錄的id分配給數據庫引擎還是數據庫引擎執行它? – Neall 2008-10-03 23:55:40

+0

在Rails中,數據庫使用序列或自動增量整數字段類型來分配ID。 – hectorsq 2008-10-04 00:03:55

回答

10

用config/database.yml中的條目設置兩個數據庫,然後生成新的遷移。根據記錄的數量和模型之間的關聯

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 

因人而異:

使用ActiveRecord :: Base.establish_connection兩個數據庫之間的這樣的遷移切換。

0

順便說一句,這可能是更有意義的,這是一個耙子或capistrano任務,而不是一個遷移。

5

如果你的數據庫是完全一樣的(數據不要求加工定做),而且沒有太多的記錄,你可以這樣做(它允許外鍵):

未測試.. 。但你的想法

#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 

如果您有記錄很多,您可能需要部分這一點莫名其妙......這樣做在10k或東西羣體。