我的困境是,我需要重新分配表中的所有记录一个新的ID,由于传统原因,但此表已与依赖它的不同模型有很多关系它的旧ID。我想提出一个重新分配身份证和保持所有关系的好方法,但我自己并没有运气。任何建议表示赞赏。复制ActiveRecord记录并保持所有关系
感谢
我的困境是,我需要重新分配表中的所有记录一个新的ID,由于传统原因,但此表已与依赖它的不同模型有很多关系它的旧ID。我想提出一个重新分配身份证和保持所有关系的好方法,但我自己并没有运气。任何建议表示赞赏。复制ActiveRecord记录并保持所有关系
感谢
此解决方案假定外键列名在所有表中始终相同。它遍历所有的表格,并用新的ID更改旧的ID。
model_id = "model_id" #foreign key name for that model
old_id = ... #model old id
new_id = ... #model new id
models = ActiveRecord::Base.send(:descendants)
for m in models do
if m.column_names.include(model_id)
m.where("#{model_id} = ?", old_id).update_all(model_id => new_id)
end
end
编辑
你也可以在模型使用reflect_on_all_associations
,遍历所有has_many
关系,并改变外键。
什么样的“额外ID”的新字段添加到该表并没有做任何事情与您的旧标识,以保持它的稳定和使用额外的ID,做你想做什么?对不起,我想不出比这个解决方案更好。
**所以你仍然可以使用你的额外ID链接到你的旧ID。
它也有一些多态关系,为此必须编写额外的代码。我认为这会有所帮助。 –
是的,你必须格外小心!我用另一种方法更新了答案。 如果是,请接受答案。 –