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

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

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

Что бы вы посоветовали объединить данные из обеих баз данных?

Какой движок базы данных вы используете? Кроме того (у меня мало опыта работы с Rails), назначает ли Rails идентификаторы для новых записей или это делает механизм базы данных?

Neall 04.10.2008 03:55

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

hectorsq 04.10.2008 04:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
2 002
3

Ответы 3

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

Я столкнулся с проблемой, когда я переключил базу данных с разработки на производство, а затем обновились записи о переменной пациента. например, у меня 10 пользователей в разработке и 3 в производстве, когда я переключил базу данных, переменная пациентов преобразовалась с 10 пользователей в 3. Не могли бы вы помочь. :)

Qubaish Bhatti 11.04.2016 16:13

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

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

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

#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 тысяч или что-то в этом роде.

Другие вопросы по теме