Carrierwave 调用 recreate_versions 后无法更新数据库以更正值

Carrierwave Cannot update a database to correct value after calling recreate_versions

我正在尝试重新处理我的 Rails 应用程序中上传的所有图像,该应用程序使用 Carrierwave,因为我添加了新的图像版本。查看我在网上找到的文档和其他示例,我使用以下代码创建了一个 rake 文件:

namespace :reprocess_user_photo do
    desc "RESIZE"
    task :recreate => :environment do
        User.all.each do |user|
            if user.photo?
                puts user.photo_url
                user.photo.cache_stored_file!
                user.photo.retrieve_from_cache!(user.photo.cache_name)
                user.photo.recreate_versions!
                puts user.photo_identifier
                user.update_column(:photo, File.basename(user.photo_url))
                user.save!
                puts user.photo_identifier
            end
        rescue => e
            puts  "ERROR: User: #{user.id} -> #{e.to_s}"
        end
    end
end

这具有以下输出:

/uploads/user/photo/2/1f99e6711141ef7ee2a516db9a197e87.jpg
1f99e6711141ef7ee2a516db9a197e87.jpg
9fda01d5a01ab9803d08d108078345bf.jpg

由此我可以看出正在重新处理的文件是正确的。新文件有一个新名称并出现在正确的目录中(新文件可以在那里找到)但是对数据库的更新不是正确的文件(这个文件名与我开始处理这个之前存在的旧文件有关功能,早已被删除)。

我也试过用以下代码替换此代码:

namespace :reprocess_user_photo do
    desc "RESIZE"
    task :recreate => :environment do
        User.all.each do |user|
            if user.photo?
                puts user.photo_url
                user.photo.cache_stored_file!
                user.photo.retrieve_from_cache!(user.photo.cache_name)
                user.photo.recreate_versions!
                puts user.photo_identifier
                user.photo = File.basename(user.photo_url)
                user.save!
                puts user.photo_identifier
            end
        rescue => e
            puts  "ERROR: User: #{user.id} -> #{e.to_s}"
        end
    end
end

输出为:

/uploads/user/photo/2/0401399fd5c9092d5388e97b1991a295.jpg
0401399fd5c9092d5388e97b1991a295.jpg
0401399fd5c9092d5388e97b1991a295.jpg

此代码根本不替换图像。

最后我尝试了以下方法:

namespace :reprocess_user_photo do
    desc "RESIZE"
    task :recreate => :environment do
        User.all.each do |user|
            if user.photo?
                puts user.photo_url
                user.photo.cache_stored_file!
                user.photo.retrieve_from_cache!(user.photo.cache_name)
                user.photo.recreate_versions!
                puts user.photo_identifier
                user.save!
                puts user.photo_identifier
            end
        rescue => e
            puts  "ERROR: User: #{user.id} -> #{e.to_s}"
        end
    end
end

它有输出

/uploads/user/photo/2/946283bd082efbf970784d3c2c00235c.jpg
946283bd082efbf970784d3c2c00235c.jpg
9fda01d5a01ab9803d08d108078345bf.jpg

在此测试中,新图像是使用文件名 5f41bc1e46c67e551e9ea36a8109bae2.jpg

创建的

又过了一天左右尝试解决我的问题后,我找到了一种可行的解决方案。这是使用以下代码:

def self.reprocess_user_picture
    User.all.each do |user|
        if user.photo?
            user.photo.recreate_versions!
            user.update_column(:photo, File.basename(user.photo.url))
        end
    end
end

此解决方案将重新处理所有版本中用户照片的所有图像上传。然而,它不会删除旧版本,但至少数据库已正确更新。

现在,我知道这个解决方案并不完美。如果有人想尝试回答原件,请这样做,我会尝试解决方案。我在其他尝试中苦苦挣扎的原因(以及为什么旧图像名称出现在数据库中)仍然不清楚,但我只能认为这是我无法弄清楚的某种缓存。