1

私のジレンマは、レガシーの理由から、テーブル内のすべてのレコードを新しいIDに再割り当てする必要があることですが、このテーブルには、古いIDを持つことに依存するさまざまなモデルとの関係がすでにたくさんあります。IDを再割り当てし、すべての関係を維持するための良い方法を考え出したいのですが、私自身は運がありませんでした。アドバイスをいただければ幸いです。

ありがとう

4

2 に答える 2

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たり、外部キーを変更したりすることもできます。

于 2012-07-04T09:27:36.030 に答える
0

このテーブルに「extraid」などの新しいフィールドを追加し、古いIDを使用して安定性を維持し、追加のIDを使用して必要な処理を実行しないでください。申し訳ありませんが、私はこの解決策よりも良いことは何も考えられません。

**そのため、追加のIDを使用して古いIDにリンクできます。

于 2012-07-04T08:11:46.043 に答える