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

问题描述 投票:0回答:3

Rails API 文档声明了 以下 关于

has_many_attached
has_one_attched
方法:

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

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

ruby-on-rails rails-activestorage
3个回答
14
投票

我假设您使用的是 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

将导致照片被清除。

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
投票

假设我有艺术家课程和 has_one_attached: 图像,并且我尝试使用factory_bot 在 rspec 中运行此测试,但它失败了。 这是我的模型 has_one_attached 的测试:图像.....仅

it 'should delete associated image when artist is deleted' do
            artist = FactoryBot.create(:artist)
            image = artist.image
            artist.destroy
            expect(image).to_not be_attached
        end

如果我们使用清除或分离,此测试将失败,原因是什么,请提供解决方案以使测试通过。预先感谢

© www.soinside.com 2019 - 2024. All rights reserved.