首页 > 解决方案 > 在 Rails 迁移中使用 SQL 访问 CarrierWave 图像 url

问题描述

我正在开发一个使用 CarrierWave 进行图像上传的小型应用程序,但是(由于有点长且不真正相关的原因)我们必须停止使用 CarrierWave 并开始使用我们自己的自定义请求将图像上传到不同的云存储服务。

但是我仍然需要已经使用 CarrierWave 上传的图像的 URL,并且image_url一旦我卸载 CarrierWave 上传器,我将无法访问该方法,所以我想将所有 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)

标签: sqlruby-on-railsrubycarrierwave

解决方案


一种方法是使用批处理功能并批量更新记录,您可以使用事务,以便如果有任何错误,更改将被回滚。

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

希望能帮助到你!!


推荐阅读