2009-07-29 34 views
6

Đây là tình huống của tôi: Tôi có 2 đối tượng người, person1 và person2, được tạo từ hai nguồn dữ liệu bên ngoài khác nhau. Tôi có một quy trình thủ công mà tôi sử dụng đã xác định rằng person1 và person2 thực sự tham chiếu đến cùng một người, vì vậy điều tôi muốn làm là "hợp nhất" chúng thành một người duy nhất và xóa bản sao.Cách tốt nhất để "hợp nhất" hai đối tượng và các liên kết của chúng trong đường ray?

Tôi không có vấn đề gì khi thực hiện điều này trên cơ sở thực địa cho chính đối tượng đó, nhưng điều phức tạp, và sẽ khó duy trì nếu tôi làm điều đó một cách tồi tệ, là những người này có liên kết (không tất cả chúng ta). Những gì tôi muốn làm là sau khi sao chép các lĩnh vực thích hợp vào person1 (mà tôi sẽ sử dụng đi về phía trước), tôi muốn di chuyển các hiệp hội từ person2 đến person1 là tốt.

Tôi nghĩ câu hỏi của tôi tóm tắt điều này: Có cách nào để 1) lặp qua từng liên kết cho một đối tượng không và 2) xác định trường ngoại tuyến cho liên kết đó. Tôi khá chắc chắn rằng nếu tôi có thể làm những điều đó tôi có thể viết một phương thức tự động di chuyển từng bản ghi liên quan từ person2 sang person1 và không thay đổi mã đó nếu tôi thêm hoặc xóa liên kết.

Bất kỳ ý tưởng nào về cách thực hiện việc này?

Cảm ơn.

Chỉnh sửa: Tôi đã triển khai (càng nhanh và bẩn càng tốt khi có vẻ như hoạt động) dựa trên các con trỏ được đưa ra trong câu trả lời của Duncan. Chỉ trong trường hợp điều này giúp mọi người, đây là một phác thảo sơ lược về cách bạn có thể di chuyển tất cả các đối tượng liên quan từ một đối tượng (@ p2 trong trường hợp này) sang một đối tượng khác (@ p1).

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 

Trả lời

3

Để kiểm tra theo chương trình các liên kết của đối tượng ActiveRecord, bạn sẽ muốn sử dụng ActiveRecord::Reflection. Các phương thức lớp được định nghĩa ở đây là các bộ sưu tập trả về bao gồm ActiveRecord::Reflection::AssociationReflection mà từ đó bạn có thể trích xuất khóa ngoài, khóa chính, tên bảng, v.v ...

Các vấn đề liên quan