使用关联和回形针附件复制rails对象

我有一个有几个关联的对象。 这些相关对象中的一些具有存储在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’,可能是因为并非所有图像都已设置。

得到它,不优雅但工作。 我曾希望dup会使用所有关联和附件复制我的对象。 那没有gem吗?

 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 } 

我通过覆盖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定义,因此每个模型都可以从中受益。