深度克隆模型时如何复制关联的s3资产?

时间:2014-08-29 14:31:34

标签: ruby-on-rails amazon-s3 paperclip

this question一致,我使用deep_cloneable复制具有单一关联的模型。该关联有一个附加图像(存储在s3中),我想在克隆时复制它。

这就是我现在正在进行深度克隆的方法 - 这将克隆gallery及其关联的photos,并更新复制的gallery以获得新的{ {1}}基于一些传递的参数:

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 original张照片,在整个copied_gallery区块中指定photo.image = old_photo.image,但我不知道知道当时是否可以访问/找到所有必要的数据。

从那里,我想知道是否可以访问deep_clone块的(include: :photos)部分。与我访问deep_cloneoriginal的方式类似,如果我可以访问原始& {在块内复制照片,然后我可以轻松地分配值。我只是不知道这种访问级别是否存在。

如果所有其他方法都失败了,我最好放弃copied_gallery块的(include: :photos)部分。我可以自己克隆画廊,然后在那之后克隆单张照片 - 就像这样:

deep_clone
但是,这感觉非常严厉。

您是否对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 块的(include: :photos)部分有任何了解,或者您对如何为每个deep_clone设置image有任何其他想法?被克隆?

1 个答案:

答案 0 :(得分: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