2008-10-03 3 views
5

У меня есть две базы данных с одинаковой структурой. Таблицы имеют целое число как первичный ключ, используемый в Rails.Базы данных Minging Rails

Если у меня есть таблица пациентов, у меня будет один пациент с использованием первичного ключа 123 в одной базе данных и другого пациента, использующего тот же первичный ключ в другой базе данных.

Что вы предложите для слияния данных из обеих баз данных?

+0

Какой двигатель базы данных вы используете? Также (у меня мало опыта Rails), Rails назначает идентификаторы для новых записей или делает это с помощью механизма базы данных? – Neall 2008-10-03 23:55:40

+0

В Rails идентификаторы назначаются базой данных с использованием типа поля последовательности или автоинкремента. – hectorsq 2008-10-04 00:03:55

ответ

10

Установите обе свои базы данных с помощью записей в config/database.yml, а затем создайте новую миграцию.

Использование ActiveRecord :: Base.establish_connection для переключения между двумя базами данных в миграции, как это:

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 в зависимости от количества записей и ассоциации между моделями.

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 или что-то.