mysql - 结合来自 2 个 Rails 应用程序的数据?
问题描述
除了几个属性外,我有 2 个具有相同模型的 Rails 应用程序。我现在需要合并这些应用程序,我正在尝试找出如何合并它们的数据。挑战是:
- ID 冲突。来自一个应用程序的用户将与另一个应用程序中的另一个用户具有相同的 ID。
- 相关记录。当 id 需要更改时,您如何保持关联?
- 处理不相同的属性。例如,当一个模型缺少属性时,您如何进行调整?
解决方案
前段时间我也遇到过类似的情况,使用数据库多租户设计的应用程序。为了将所有数据合并到一个数据库中,我最终创建了一个 rake 任务,该任务将遍历每条记录和关联,并在新数据库中重新创建它们。
该任务有两个参数SOURCE
和DESTINATION
,它会像这样运行:
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 和新 ID。
我知道每个应用程序的复杂性会使这个过程变得非常困难,但就我而言,这个想法作为一个起点非常有用。
推荐阅读
- javascript - 带有手动控制的滑块不会自动播放 - 可能是 setInterval 行为的问题?
- mongodb - 在将 MongoDB 连接到 VS Code 时需要帮助
- amazon-web-services - S3 批量操作 - “禁止读取清单:拒绝访问”
- angular - 找不到模块 @angular/core & Experimental Decorators vs2019
- optimization - 如何在颤动中优化可变长度小部件的 X 文本的显示
- angularjs - 如何从服务测试 EventEmitter
- r - 如何使用和理解 (R-) 传单的 crsClasses?
- groovy - 使用地图时静态编译失败
- python - 是否可以使用 openpyxl 将样式应用于整个工作表?
- fitnesse - FitNesse:保持排序的嵌套 SuiteSetUps 的替代方案