在Rails迁移中使用SQL访问CarrierWave图像URL

时间:2018-06-15 08:42:35

标签: sql ruby-on-rails ruby carrierwave

我正在开发一个使用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)

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

希望它有所帮助!!