Слияние баз данных Rails - PullRequest
       13

Слияние баз данных Rails

5 голосов
/ 04 октября 2008

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

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

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

Ответы [ 3 ]

10 голосов
/ 04 октября 2008

Настройте обе базы данных с помощью записей в 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 в зависимости от количества записей и связей между моделями.

5 голосов
/ 04 октября 2008

Если ваши базы данных точно такие же (данные не требуют пользовательской обработки) и не слишком много записей, вы можете сделать это (что позволяет использовать внешние ключи):

Непроверенный ... Но вы поняли

#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

Если у вас МНОГО записей, вам, возможно, придется как-то разделить это ... сделать это группами по 10 тысяч или что-то в этом роде.

0 голосов
/ 04 октября 2008

Кстати, для этого, вероятно, имеет больше смысла, чтобы это было делом рейка или капистрано, а не миграцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...