【问题标题】:Access CarrierWave image url using SQL in Rails migration在 Rails 迁移中使用 SQL 访问 CarrierWave 图像 url
【发布时间】: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


【解决方案1】:

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

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

希望对你有帮助!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多