我正在开发一个使用CarrierWave进行图片上传的小应用程序,但是(由于有点长且不太相关的原因)我们不得不停止使用CarrierWave并开始使用我们自己的自定义请求将图像上传到不同的云存储服务。
但是我仍然需要使用CarrierWave上传的图像的URL,一旦我卸载CarrierWave上传器,我将无法访问image_url
方法,因此我想保存所有网址到我的模型上的新列,并尽可能优化迁移。
我一直在搜索从数据库直接访问网址的方法(我的意思是,CarrierWave必须存储某处),但到目前为止还没有运气。
我可以做这样的事情(business_image
是安装上传器的列,image_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)
答案 0 :(得分:0)
一种方法是批量使用批处理功能和批量更新记录,您可以使用事务处理,这样如果有任何错误,更改将被回滚。
def change
add_column :business_cards, :image_url, :string
BusinessCard.find_each(batch_size: xxx) do |bc|
ActiveRecord::Base.transaction do
bc.update(image_url: bc.business_image_url)
rescue => e
raise ActiveRecord::Rollback
end
end
end
希望它有所帮助!!