ActiveStorage:在所有者记录被销毁后分离(而不是清除)附件?

Tsu*_*omu 5 ruby-on-rails rails-activestorage

Rails API 文档说明了以下关于has_many_attachedhas_one_attched方法的内容:

如果 :dependent 选项未设置,则每当记录被销毁时,所有附件都将被清除(即销毁)。

具体来说,我应该为这个选项指定什么值?

mov*_*son 11

我假设您使用的是 Rails 5.2。文档不是很好,但源代码有助于填补空白。下面是从相关文件的几行(代码是相同的两个has_one_attachedhas_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
Run Code Online (Sandbox Code Playgroud)

根据方法定义(同样,这对于has_one_attached和是相同的has_many_attached),如果没有另外指定,:dependent将被设置为:purge_later。所以当底层记录被删除时,你会得到以下结果:

has_one_attached :photo

将导致照片被清除。

has_one_attached :photo, dependent: :purge_later

将导致照片被清除。

has_one_attached :photo, dependent: :detach

将导致照片被分离,但活动存储 blob 保持不变。

请注意,除此之外的任何内容:purge_later都会导致附件被分离而不是清除。如此反常:

has_one_attached :photo, dependent: :purge

将导致照片被分离,而不是被清除

代码似乎在 Rails 6 中进行了重大重构,因此可能已经解决了这个奇怪的问题。

更新:此问题在 Rails 5.2 中提交,并且有一个待处理的 PR