2009-07-29 17 views
6

İşte durumum: İki farklı dış veri kaynağından oluşturulmuş 2 kişi nesneye, person1 ve person2'ye sahibim. Bu kişinin1 ve kişi2'nin aynı kişiye atıfta bulunduğunu belirleyen kullanmış olduğum manuel bir işlem var, bu yüzden yapmak istediklerimi tek bir kişiye "birleştirmek" ve yinelemeyi kaldırmak.İki nesneyi ve derneklerini raylarda en iyi nasıl birleştirirsiniz?

Bu alanda bir nesnenin kendisi için alan bazında yapmayla ilgili bir sorunum yok, ama zor olan şey, ve eğer bunu kötü yaparsam sürdürmek zor olacak, bu insanların dernekleri var mı? hepimiz). Yapmak istediğim, uygun alanları 1'e (sonra ileriye doğru kullanacağım) kopyaladıktan sonra, dernekleri kişi2'den şahsen1'e taşımak istiyorum.

Sanırım sorum şu şekilde kaynıyor: 1) Bir nesne için her ilişkiyi yinelemenin bir yolu var mı, ve 2) İlgili ilişkilendirmenin yabancı_sayısını belirleme. Bu şeyleri yapabiliyor olsaydım, her bir ilişkili kaydı kişi2'den kişi1'e otomatik olarak taşıyan bir yöntem yazabilirim ve bir ilişki eklediğimde veya çıkardığımda bu kodu değiştiremezdim.

Bunu nasıl yapacağınıza dair herhangi bir fikir var mı?

Teşekkürler.

Düzenleme: Duncan'ın yanıtında verilen göstergelere dayalı olarak (çalıştığını göründüğünde olabildiğince çabuk ve kirli) kodu uygulamıyorum. Sadece bu durumun herkese yardımcı olması durumunda, tüm ilişkili nesneleri bir nesneden (bu durumda @ p2) diğerine (@ p1) nasıl taşıyabileceğinizin kaba bir taslağıdır.

Person.reflect_on_all_associations.each do |assoc| 
    if assoc.macro == :has_many 
    @p2.send(assoc.name).each do |assoc_obj| 
     assoc_obj.update_attribute(assoc.primary_key_name, @p1.id) 
    end 
    elsif assoc.macro == :has_one 
    @p2.send(assoc.name).update_attribute(assoc.primary_key_name, @p1.id) 
    end 
end 

cevap

İlgili konular