ActiveStorage: отсоединить (вместо очистки) вложение после уничтожения записи владельца? - PullRequest
0 голосов
/ 21 мая 2019

Документация по Rails API гласит: следующие о has_many_attached и has_one_attched методы:

Если не установлен параметр: зависимый, все вложения будуточищается (то есть уничтожается) всякий раз, когда запись уничтожается.

В частности, какое значение я должен указать для этой опции?

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Я предполагаю, что вы используете 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 .

0 голосов
/ 21 мая 2019

Добавление :nullify может помочь вам.Смотрите документ: https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options

...