我想设置一个特定的上传器,这样当相关的模型对象被销毁时,亚马逊 s3 上的文件就不会被删除。
原因是我的上传模型记录虽然被销毁,但仍然在第二个审计表中引用。
我正在使用雾、载波和 s3。
我想设置一个特定的上传器,这样当相关的模型对象被销毁时,亚马逊 s3 上的文件就不会被删除。
原因是我的上传模型记录虽然被销毁,但仍然在第二个审计表中引用。
我正在使用雾、载波和 s3。
实际上有一种方法可以做到这一点,你只需要跳过删除它的回调:
skip_callback :commit, :after, :remove_<column_name>!
例如
# user.rb
mount_uploader :avatar
skip_callback :commit, :after, :remove_avatar!
见https://github.com/carrierwaveuploader/carrierwave#skipping-activerecord-callbacks
好吧,AFAIK仅在remove_previously_stored_files_after_update
模型对象updated
设置为false
不会删除旧模型对象时才有效file
update
但是在您的情况下,您必须确保在相关模型对象被销毁时文件仍然存在
好吧,我不认为那里(如果您检查此处的代码)是当前可用的任何Carrierwave
机制
但你可以覆盖remove!
来实现同样的我猜这涉及设置attr_accessor
(这是决定是保留文件还是删除它的标志)
在您想要的模型中定义一个attr_accessor
(比如keep_file)
并在所需的上传者中覆盖删除!方法
class MyUploader < CarrierWave::Uploader::Base
def remove!
unless model.keep_file
super
end
end
end
并确保attr_accessor
在销毁对象之前设置对象(如果要保留已删除的文件)
例子
u = User.find(10)
u.keep_file = true
u.destroy
这将确保从数据库中删除记录时清理文件
让我知道是否有更好的方法
希望这有帮助
CarrierWave.configure do |config|
config.remove_previously_stored_files_after_update = false
end
如果您想在每次上传的基础上进行配置:
class AvatarUploader < CarrierWave::Uploader::Base
configure do |config|
config.remove_previously_stored_files_after_update = false
end
...
end
我有一个案例,我需要我的上传者不仅在上传新文件时保存文件,而且在删除记录本身时也保存文件。我发现上面 Dave Newton 和 mkk 建议的组合效果很好:
在我的上传器中,我添加了:
class AttachmentUploader < CarrierWave::Uploader::Base
configure do |config|
config.remove_previously_stored_files_after_update = false
end
end
然后在我的模型上添加:
class Resource < ApplicationRecord
# Skip the remove callback so the files remain upon deletion of the Resource record
mount_uploader :attachment, AttachmentUploader
skip_callback :commit, :after, :remove_attachment!
...
end