これは私にとって実際に機能するものです。これを config/initializers/paper_trail/.rb に置きます
module PaperTrail
module Reifier
class << self
def reify_attributes(model, version, attrs)
enums = model.class.respond_to?(:defined_enums) ? model.class.defined_enums : {}
AttributeSerializers::ObjectAttribute.new(model.class).deserialize(attrs)
attrs.each do |k, v|
is_enum_without_type_caster = ::ActiveRecord::VERSION::MAJOR < 5 && enums.key?(k)
if model.send("#{k}").is_a?(CarrierWave::Uploader::Base)
if v.present?
model.send("remote_#{k}_url=", v["#{k}"][:url])
model.send("#{k}").recreate_versions!
else
model.send("remove_#{k}!")
end
else
if model.has_attribute?(k) && !is_enum_without_type_caster
model[k.to_sym] = v
elsif model.respond_to?("#{k}=")
model.send("#{k}=", v)
elsif version.logger
version.logger.warn(
"Attribute #{k} does not exist on #{version.item_type} (Version id: #{version.id})."
)
end
end
end
end
end
end
end
これは S3 + heroku で動作するように reify メソッドをオーバーライドします
アップローダが更新または削除されたレコードから古いファイルを保持するには、アップローダでこれを行います
configure do |config|
config.remove_previously_stored_files_after_update = false
end
def remove!
true
end
次に、古いファイルを時々クリアするルーチンを作成します。幸運を祈ります