目前我有一个模型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
此外,如果上传到开发机器,此解决方案在本地不起作用。
答案 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复制图像,而是复制并再次上传,这可能效率有点低,但这是另外一个无关的问题。