Rails API 文档声明了 以下 关于
has_many_attached
和 has_one_attched
方法:
如果未设置 :dependent 选项,则每当记录被销毁时,所有附件都将被清除(即销毁)。
具体来说,我应该为此选项指定什么值?
我假设您使用的是 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。
假设我有艺术家课程和 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
如果我们使用清除或分离,此测试将失败,原因是什么,请提供解决方案以使测试通过。预先感谢