在Rails中,软删除(Soft Delete)是一种常用的策略,用于在不实际从数据库中移除记录的情况下标记它们为已删除。这对于维护数据的完整性以及允许恢复误删除的数据非常有用。当涉及到活动存储(Active Storage)中的Blob和附件时,软删除的实现需要一些额外的考虑。
软删除:在数据库中为记录添加一个标志字段(通常是deleted_at
),当记录被“删除”时,不是真正移除它,而是设置这个字段的值。查询时,可以过滤掉这些标记为删除的记录。
活动存储(Active Storage):Rails的一个组件,用于处理文件上传和附件管理。
应用场景包括:
要在Rails中实现活动存储Blob和附件的软删除,可以采取以下步骤:
deleted_at
字段:在Blob和附件的表中添加一个deleted_at
字段。# migration
add_column :active_storage_blobs, :deleted_at, :datetime
add_column :active_storage_attachments, :deleted_at, :datetime
deleted_at
字段而不是实际删除记录。# app/models/active_storage/blob.rb
class ActiveStorage::Blob < ApplicationRecord
def destroy
update(deleted_at: Time.current)
end
end
# app/models/active_storage/attachment.rb
class ActiveStorage::Attachment < ApplicationRecord
def destroy
update(deleted_at: Time.current)
end
end
# 在需要的地方添加过滤条件
ActiveStorage::Blob.where.not(deleted_at: nil)
ActiveStorage::Attachment.where.not(deleted_at: nil)
问题:软删除后,文件仍然可以通过直接链接访问。
解决方法:
# 在控制器中
def show
blob = ActiveStorage::Blob.find(params[:id])
if blob.deleted_at
redirect_to root_path, alert: 'File not found.'
else
redirect_to rails_blob_path(blob, disposition: "inline")
end
end
问题:如何彻底删除已软删除的文件?
解决方法:
# Rake任务示例
namespace :active_storage do
desc "Purge deleted blobs and attachments"
task purge_deleted: :environment do
ActiveStorage::Blob.where.not(deleted_at: nil).find_each(&:purge_later)
ActiveStorage::Attachment.where.not(deleted_at: nil).find_each(&:purge_later)
end
end
通过上述方法,可以在Rails应用中有效地实现活动存储Blob和附件的软删除,并处理相关的问题。
没有搜到相关的文章