Rails Paperclip从模型A到模型B的复制图像集

时间:2016-01-15 08:47:30

标签: ruby-on-rails image amazon-s3 paperclip

目前我有一个模型A(ItemRequest),它有很多图像。 一旦该项目请求被批准,它就会创建一个模型B(项目),该模型也有许多图像。

我正在使用回形针处理图像上传到S3,我想要的是,在批准过程完成后,将图像从模型A复制到模型B,复制它们。

遵循一些类似的问题(但没有使用包含许多图像的模型)我在我的ItemRequest模型批准方法中写了以下内容。

if images.length > 0
  item.images = images.map { |img| img.dup }
end

这显然创建了一组新的Image模型,但是当尝试访问url时,它不会打开任何图像,S3返回403。 我已经检查过,S3中没有创建图像。我可以访问其他图像,以便正确配置S3。 关于如何解决这个问题的任何想法?

def resolve! user_id
  if status != RESOLVED
    ActiveRecord::Base.transaction do
      self.resolved_by_id = user_id
      self.resolved_date  = DateTime.now
      self.status         = RESOLVED
      save!

      catalog_item = Item.create(
          name:            item_name,
          oem_name:        oem_name,
          description:     description,
          category_id:     category_id,
          make:            make,
          part_number:     part_number,
          uom:             uom,
          cost_in_cents:   cost_in_cents,
          weight_in_grams: weight_in_grams
      )
      if images.length > 0
       catalog_item.images = images.map { |img| img.dup }
       catalog_item.save
      end
    end
   end
   true
end

值得一提的是,这并不简化事情,是我的Image模型是多态的。

我设法写了一个解决方案,但还不满意。

将其添加到图像模型

def file_remote_url=(url_value)
  self.file = URI.parse url_value
  @file_remote_url = url_value
end

然后

catalog_item.images = images.map { |img|
  new_image = Image.new()
  new_image.file_remote_url = img.url
  new_image
}
catalog_item.save

此外,如果上传到开发机器,此解决方案在本地不起作用。

1 个答案:

答案 0 :(得分:0)

经过几天尝试不同的方法后,这就解决了我的问题:

catalog_item.images = images.map do |img|
  new_image = Image.new
  new_image.imageable_type = 'CatalogItem'
  new_image.imageable_id = catalog_item.id
  new_image.file = img.file
  new_image
end

这将创建图像的副本,而不是仅更改参考。据我所知,如果您使用的是S3和回形针,它不会简单地使用S3 api复制图像,而是复制并再次上传,这可能效率有点低,但这是另外一个无关的问题。