我有一个有几个关联的对象。这些相关对象中的一些具有存储在S3处的回形针附件。如果我复制了对象和关联,它可以正常工作,但附件不会重复。
这在没有获取图像的情况下有效:
copy_salon = @salon.dup
copy_salon.about_us_versions = @salon.about_us_versions.collect{|about_us| about_us.dup}
我试图像这样获得图像链接:
copy_salon = @salon.dup
copy_salon.about_us_versions = @salon.about_us_versions.collect{|about_us|
about_us_dup = about_us.dup
if about_us.about_us_image then about_us_dup.about_us_image = about_us.about_us_image end
if about_us.team_image then about_us_dup.team_image = about_us.team_image end
about_us_dup
}
然后我收到错误'无法将nil转换为String',可能是因为并非所有图像都已设置。
答案 0 :(得分:1)
得到它,不优雅但工作。我曾希望dup会使用所有关联和附件复制我的对象。那不是有什么宝石吗?
copy_salon = @salon.dup
copy_salon.about_us_versions = @salon.about_us_versions.collect{|about_us|
about_us_dup = about_us.dup
unless about_us.about_us_image.url == "/about_us_images/original/missing.png" then about_us_dup.about_us_image = about_us.about_us_image end
unless about_us.team_image.url == "/team_images/original/missing.png" then about_us_dup.team_image = about_us.team_image end
about_us_dup
}
答案 1 :(得分:1)
我通过覆盖dup
更简单,至少对于Paperclip附件:
def dup
duplicate = super
# attachment_definitions is defined if model has paperclip attachments
return duplicate unless self.class.respond_to?(:attachment_definitions)
duplicate.tap do |d|
self.class.attachment_definitions.keys.each do |name|
d.send("#{name}=", send(name)) if send(name).exists?
end
end
end
可以在ApplicationRecord
中对此进行定义,因此每个模型都可以从中获益。