我们有一个用Rails编写的SAAS平台,使用postgres的基于模式的多租户和Apartment gem。不同的架构是相同的,每个表中的表数和列数相同。我们希望迁移到基于外键的多租户系统,我们希望将来自不同架构的所有记录合并到单个架构中,用tenant_id标识每条记录。合并来自不同架构的所有记录并保留外键关系的正确方法是什么?
这种情况需要小心。我认为(我可能是错的(最好的方法是添加到所有表中tenant_id
和original_id
......在尝试迁移之前,请使用该记录id
填充所有表中的original_id
。从本质上讲,这是为了记录合并前id
的价值。
合并后,您可以运行一个 rake 任务来重建关联。 所以如果你有...
class Foo
has_many :bars
迁移脚本可以(迁移后(
Bar.all.each do |bar|
foo = Foo.find_by(tenant_id: bar.tenant_id, original_id: bar.foo_id)
bar.update_column(:foo_id, foo.id)
end
你需要为每个关系做类似的事情,所以这有点艰难。
希望其他人能想出更好的解决方案。
请注意,这不是幂等的。如果出现错误,则无法重新启动它,除非完全重新进行合并。