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

时间:2012-07-11 23:40:30

标签: ruby-on-rails paperclip dup

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

2 个答案:

答案 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中对此进行定义,因此每个模型都可以从中获益。