2014-08-29 61 views
0

沿着this question的路線,我使用deep_cloneable複製一個模型與其單個關聯。該關聯具有附加的圖像(存儲在s3中),我想在克隆時複製該圖像。深度克隆模型時,如何複製關聯的s3資產?

這就是我正在做的深克隆了 - 這個克隆及其關聯photos沿着gallery,並更新複製gallery根據一些傳遞的參數有一個新的location_id

new_gallery = @gallery.deep_clone(incude: :photos) do |original, copied_gallery| 
    copied_gallery.location_id = gallery_params['Location_id'] 
end 

new_gallery.save 

我的第一個想法是以某種方式迭代originalcopied_gallery的照片,在總體deep_clone區塊內分配photo.image = old_photo.image,但我不知道是否所有必要的數據在該點都可以訪問/找到。

從那裏,我想知道是否有訪問deep_clone塊的(include: :photos)部分。類似於我如何訪問originalcopied_gallery,如果我可以訪問塊中原始的&複製的照片,那麼我可以輕鬆地分配值。我只是不知道這個訪問級別是否存在。

如果一切都失敗了,我最好放棄deep_clone塊的(include: :photos)部分。我可以自己克隆畫廊,然後克隆個別照片 - 就像這樣:

new_gallery = @gallery.deep_clone do |original, copied_gallery| 
    copied_gallery.location_id = gallery_params['Location_id'] 
end 

new_gallery.save 

@gallery.photos.each do |photo| 
    new_photo = photo.deep_clone do |original, copied_photo| 
    copied_photo.image = original.image 
    end 

    new_photo.save 
end 

雖然這感覺很霸道。

你有沒有洞察deep_clone塊的(include: :photos)部分,或者你對如何設置image每個photos的任何其他的想法被克隆?

回答

0

我誤解了這個塊 - 所有的模型都在那裏被處理,而不僅僅是你所謂的deep_clone

藉此例如:

pirate.deep_clone :include => :parrot do |original, kopy| 
    kopy.cloned_from_id = original.id if kopy.respond_to?(:cloned_from_id) 
end 

kopy是指兩種數據類型,pirateparrot。這就是爲什麼您需要在塊中包含if kopy.respond_to?(:cloned_from_id)--每種模式都會遇到(如果您使用的是include),可能無法響應您嘗試使用的字段。

所以,在我的情況,我會做到這一點:

new_gallery = @gallery.deep_clone(incude: :photos) do |original, copied_item| 
    copied_item.location_id = gallery_params['Location_id'] 
    copied_item.image  = original.image if copied_item.respond_to?(:image) 
end 

new_gallery.save