Я предполагаю, что вы используете Rails 5.2.Документация не очень хорошая, но исходный код помогает заполнить пробелы.Вот несколько строк из соответствующего файла (код идентичен как для has_one_attached
, так и для has_many_attached
):
# /active_storage/attached/macros.rb
def has_one_attached(name, dependent: :purge_later)
...
if dependent == :purge_later
after_destroy_commit { public_send(name).purge_later }
else
before_destroy { public_send(name).detach }
end
end
В соответствии с определением метода (опять-таки, это одинаково для has_one_attached
иhas_many_attached
), :dependent
будет установлено на :purge_later
, если не указано иное.Таким образом, вы получите следующие результаты при удалении базовой записи:
has_one_attached :photo
В результате будет очищена photo
.
has_one_attached :photo, dependent: :purge_later
В результате будет удалена фотография.
has_one_attached :photo, dependent: :detach
В результате фотография будет отсоединена, но активный накопитель будет оставлен без изменений.
Обратите внимание, что все, кроме :purge_later
, приведет к отсоединению, а не к очистке вложений. Так извращенно:
has_one_attached :photo, dependent: :purge
Результатом будет фотография отсоединенный, не очищенный .
Код, похоже, подвергся значительному рефакторингу в Rails 6, поэтому эта странность, возможно, была устранена.
ОБНОВЛЕНИЕ: Эта проблема была отправлена в Rails 5.2 и ожидает PR .