合并来自2个Rails应用程序的数据?

时间:2018-10-04 11:49:22

标签: mysql ruby-on-rails migration

除了两个属性外,我有2个具有相同模型的Rails应用程序。现在,我需要合并这些应用程序,并且正在尝试找出如何合并它们的数据。挑战是:

  • 冲突的ID。来自一个应用程序的用户将具有与另一个应用程序中的另一个用户相同的ID。
  • 相关记录。当id需要更改时,如何保持关联?
  • 处理不同的属性。例如。当一个模型缺少属性时,如何进行调整?

我知道seed_dumpyaml_db,但是我不确定它们是否是解决我的问题的好方法

1 个答案:

答案 0 :(得分:1)

前段时间,我遇到了一个类似的情况,该应用程序设计了数据库多租户。为了将所有数据合并到一个数据库中,我最终创建了一个rake任务,该任务将遍历每个记录和关联,并在新数据库中重新创建它们。

该任务具有两个参数SOURCEDESTINATION,它的运行方式如下: rake db:merge SOURCE=some_database DESTINATION=new_database。该任务针对我需要合并的每个数据库运行。

在rake任务中,想法是这样的:

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

在某些情况下,为了跟踪我使用散列的关联中的ID,该散列会跟踪原始和 新的ID。

我知道每个应用程序的复杂性都会使此过程变得非常困难,但是在我看来 这种想法作为起点非常有用。