Rails 从模型 A 到模型 B 的回形针复制图像集
Rails Paperclip copy set of images from model A to model B
目前我有一个有很多图像的模型 A (ItemRequest)。
此项目请求获得批准后,它会创建一个模型 B(项目),该模型也有很多图像。
我正在使用回形针处理图片上传到 S3,我想要的是在批准过程完成后,将图片从模型 A 复制到模型 B,复制它们。
根据一些类似的问题(但 none 使用带有许多图像的模型)我在我的 ItemRequest 模型批准方法中编写了以下内容。
if images.length > 0
item.images = images.map { |img| img.dup }
end
这显然创建了一组新的图像模型,但是当试图访问 url 时,它不会打开任何图像和 S3 returns 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
值得一提的是,我的图像模型是多态的。
我已经设法编写了一个解决方案,但对它还不满意。
将此添加到图像模型
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
此外,如果上传到开发机器,此解决方案在本地不起作用。
经过几天尝试不同的方法后,以下是为我解决问题的方法:
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 复制图像,而是复制并再次上传,这可能有点低效,但是是另一个完全不相关的问题。
目前我有一个有很多图像的模型 A (ItemRequest)。 此项目请求获得批准后,它会创建一个模型 B(项目),该模型也有很多图像。
我正在使用回形针处理图片上传到 S3,我想要的是在批准过程完成后,将图片从模型 A 复制到模型 B,复制它们。
根据一些类似的问题(但 none 使用带有许多图像的模型)我在我的 ItemRequest 模型批准方法中编写了以下内容。
if images.length > 0
item.images = images.map { |img| img.dup }
end
这显然创建了一组新的图像模型,但是当试图访问 url 时,它不会打开任何图像和 S3 returns 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
值得一提的是,我的图像模型是多态的。
我已经设法编写了一个解决方案,但对它还不满意。
将此添加到图像模型
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
此外,如果上传到开发机器,此解决方案在本地不起作用。
经过几天尝试不同的方法后,以下是为我解决问题的方法:
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 复制图像,而是复制并再次上传,这可能有点低效,但是是另一个完全不相关的问题。