2008-10-03 404 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或东西群体。