私のジレンマは、レガシーの理由から、テーブル内のすべてのレコードを新しいIDに再割り当てする必要があることですが、このテーブルには、古いIDを持つことに依存するさまざまなモデルとの関係がすでにたくさんあります。IDを再割り当てし、すべての関係を維持するための良い方法を考え出したいのですが、私自身は運がありませんでした。アドバイスをいただければ幸いです。
ありがとう
私のジレンマは、レガシーの理由から、テーブル内のすべてのレコードを新しいIDに再割り当てする必要があることですが、このテーブルには、古いIDを持つことに依存するさまざまなモデルとの関係がすでにたくさんあります。IDを再割り当てし、すべての関係を維持するための良い方法を考え出したいのですが、私自身は運がありませんでした。アドバイスをいただければ幸いです。
ありがとう
このソリューションは、外部キー列名がすべてのテーブルで常に同じであることを前提としています。すべてのテーブルを調べて、古い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
たり、外部キーを変更したりすることもできます。
このテーブルに「extraid」などの新しいフィールドを追加し、古いIDを使用して安定性を維持し、追加のIDを使用して必要な処理を実行しないでください。申し訳ありませんが、私はこの解決策よりも良いことは何も考えられません。
**そのため、追加のIDを使用して古いIDにリンクできます。