【发布时间】:2023-03-13 21:00:02
【问题描述】:
我正在开发一个使用 CarrierWave 进行图像上传的小型应用程序,但是(由于有点长且并不真正相关的原因)我们必须停止使用 CarrierWave 并开始使用我们自己的自定义请求将图像上传到不同的云存储服务。
但是我仍然需要已经使用 CarrierWave 上传的图像的 URL,一旦我卸载 CarrierWave 上传器,我将无法访问 image_url 方法,所以我想将所有 URL 保存到我的模型上的新列,并尽可能优化迁移。
我已经搜索了从数据库中直接访问 url 的方法(我的意思是,CarrierWave 必须将其存储在某处)但到目前为止还没有运气。
我可以这样做(business_image 是上传器所在的列,image_url 是我要存储 url 的新列):
def change
add_column :business_cards, :image_url, :string
BusinessCard.all.each do |bc|
bc.update(image_url: bc.business_image_url)
end
end
但这显然根本没有优化,因为它会加载所有名片并一一更新。有没有办法在一条 SQL 语句中做到这一点?
(我使用的是 Rails 5.1.4、PostgreSQL 10.3 和carrierWave 1.2.1)
【问题讨论】:
-
实现mounter逻辑的唯一方法是SQL查询。 IE。如果你有像
'business_card' + '/id/' + image_name这样简单的安装逻辑,你可以在 SQL 中实现它。 -
保持这种“一次一个”的逻辑并让它运行很长时间就足够了? (这取决于数据库有多大!!)但不要使用
all,而是使用find_each。这可以防止一次将所有记录加载到内存中。 -
但是是的,正如@PavelMikhailyuk 所说,URL 取决于载波上传器的定义。它们在
app/uploaders/*中是如何定义的?你可以根据这个写一些批量更新的SQL。 -
感谢您的回复!我不知道 CarrierWave 从配置值重建 URL,而不是将其保存在数据库中。载波上传器配置不是那么简单,但是由于我的数据库不是太大(大约 3000 条记录),我将使用
find_each来完成 @TomLord 推荐
标签: sql ruby-on-rails ruby carrierwave