与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_clone
和original
的方式类似,如果我可以访问原始& {在块内复制照片,然后我可以轻松地分配值。我只是不知道这种访问级别是否存在。
如果所有其他方法都失败了,我最好放弃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
有任何其他想法?被克隆?
答案 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
指的是两种数据类型,pirate
和parrot
。这就是为什么你需要在块中包含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