2

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

4

2 回答 2

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
                                                                }
于 2012-07-11T23:53:22.017 回答
1

通过覆盖dup,我得到了它更简单,至少对于回形针附件:

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因此每个模型都可以从中受益。

于 2017-07-27T12:33:28.723 回答