2012-07-04 22 views
1

我的困境是,我需要重新分配表中的所有记录一个新的ID,由于传统原因,但此表已与依赖它的不同模型有很多关系它的旧ID。我想提出一个重新分配身份证和保持所有关系的好方法,但我自己并没有运气。任何建议表示赞赏。复制ActiveRecord记录并保持所有关系

感谢

回答

2

此解决方案假定外键列名在所有表中始终相同。它遍历所有的表格,并用新的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关系,并改变外键。

+0

它也有一些多态关系,为此必须编写额外的代码。我认为这会有所帮助。 –

+0

是的,你必须格外小心!我用另一种方法更新了答案。 如果是,请接受答案。 –

0

什么样的“额外ID”的新字段添加到该表并没有做任何事情与您的旧标识,以保持它的稳定和使用额外的ID,做你想做什么?对不起,我想不出比这个解决方案更好。

**所以你仍然可以使用你的额外ID链接到你的旧ID。

相关问题