Для меня переопределение метода Paperclip::Attachment#clear
не сработало.Я должен был переопределить Paperclip::Attachment#queue_all_for_delete
.
Как сказал Алекс Фальке, у Paperclip есть опция :preserve_files
, поэтому, очевидно, что если вы хотите сохранить все вложения, вы бы использовали их вместо переопределения.
Если у вас есть особый случай, переопределение #queue_all_for_delete
- это путь, но вам придется делать это выборочно.Исправление обезьян является глобальным, так что это не лучший подход.Я пытался использовать уточнения, чтобы ограничить область исправления обезьяны, но лексическая область видимости не очень хорошо подходила для моего варианта использования.
Итак, я закончил с этим модулем, который внедряет себя в путь поиска метода и выборочно определяет или отменяет определение переопределения no-op для #queue_all_for_delete
:
module PaperclipKeepAttachment
def self.with_patch
patch
add_override
yield
ensure
remove_override
end
def self.patch
me = self
Paperclip::Attachment.class_eval{ prepend me } unless Paperclip::Attachment.ancestors.include?(me)
end
def self.add_override
define_method(:queue_all_for_delete) do
# no-op
end
end
def self.remove_override
remove_method(:queue_all_for_delete)
end
end
С его помощью вы можетесделать что-то вроде:
PaperclipKeepAttachment.with_patch do
# The record will be destroyed but the attachment kept intact
first_record.destroy
end
# The record will be destroyed and the attachment removed
second_record.destroy