2012-07-04 3 views
1

내 딜레마는 레거시 이유로 테이블의 모든 레코드를 새 ID로 다시 할당해야한다는 것이지만이 테이블은 이미 다른 모델과 관계가 많습니다 그 옛 이드. ID를 다시 할당하고 모든 관계를 유지하는 좋은 방법을 생각해보고 싶지만 나 자신에게는 운이 없었습니다. 모든 조언을 부탁드립니다.중복 ActiveRecord 레코드 및 모든 관계 유지

감사

이 표에 "추가 아이디"와 같은 새로운 필드를 추가하고 안정을 유지하고 당신이 원하는 일을하기 위해 별도의 ID를 사용하는 기존의 ID로 아무것도하지 않는 것에 대해

답변

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와 연결할 수 있습니다.