Я столкнулся с подобной ситуацией некоторое время назад с приложением, разработанным для работы с несколькими базами данных.Чтобы объединить все данные в единую базу данных, я создал задачу rake, которая проходила бы через каждую запись и связь и воссоздала их в новой базе данных.
Задача имела два аргумента SOURCE
и DESTINATION
и он будет работать как: rake db:merge SOURCE=some_database DESTINATION=new_database
.Задача запускалась для каждой базы данных, которую мне нужно было объединить.
Внутри грабельной задачи идея была примерно такой:
namespace :db do
task :merge => [:environment, :load_config] do |t, args|
raise "Empty SOURCE provided" if not ENV["SOURCE"] or ENV["SOURCE"].empty?
@source = ENV['SOURCE'].to_sym
@destination = (ENV['RAILS_ENV'] || 'development').to_sym
# for each model
ActiveRecord::Base.establish_connection(@source)
# obtain the records and its associations
ActiveRecord::Base.establish_connection(@destination)
# loop through each record and build all associated records
# apply any necesary transformation to data
# then build the record and fill it with the new associations
# skip callbacks / validations if needed
# then save
В некоторых случаях для отслеживания идентификаторов в ассоциациях, которые я использовалхэши, которые отслеживали исходный и новый идентификатор.
Я знаю, что сложности каждого приложения могут сделать этот процесс действительно сложным, но в моем случае эта идея оказалась очень полезной в качестве отправной точки.