Module: ActivemodelObjectInfo::DeletedOperation

Extended by:
ActiveSupport::Concern
Defined in:
lib/activemodel_object_info/deleted_operation.rb

Overview

用来进行和删除操作相关的数据库模型的功能模组。主要结合了使用 :deleted 字段标识数据软删除的功能。

核心作用与职责: 为 ActiveRecord 模型提供标准化的“软删除(Soft Delete)”功能。 引入该模块后,会自动通过 default_scope 过滤掉已标记为删除的记录, 并注入 soft_delete / soft_delete! 方法。在执行软删除时,会自动更新 相关的审计字段(如 deleted_by, deleted_at, updated_by)。

核心重要方法:

  • #soft_delete:执行软删除并调用 save 更新数据。
  • #soft_delete!:执行软删除并调用 save! 更新数据(抛出异常)。
  • #restore:恢复已软删除的数据。
  • #restore!:强制恢复已软删除的数据(抛出异常)。
  • #delete_block:底层通用的删除字段赋值逻辑块。

[Changelog] [2026-07-28] 新增 restore 与 restore! 方法以支持软删除数据恢复 (shiner527) [2026-07-28] 补充完整 YARD 文档、行内注释,清理尾随空格 (shiner527) [2021-04-19] 创建基础模块,提供软删除与作用域注入功能 (shiner527)

Examples:

详细使用方法与示例

class User < ApplicationRecord
  include ActivemodelObjectInfo::DeletedOperation

  # 可选:覆盖默认的配置常量
  DELETED_FIELD = 'is_deleted'
  DELETED_VALID_VALUE = false
  DELETED_INVALID_VALUE = true
end

# 1. 默认查询过滤
# 查询数据时会自动应用 default_scope: WHERE is_deleted = false
User.all

# 2. 软删除记录
# 软删除一条记录(必须要传入 user_id 用于审计)
user = User.find(1)
user.soft_delete(user_id: current_user.id, refresh_updated: true)
# 此时 user 的 is_deleted 变为 true,同时 deleted_at, deleted_by, updated_by 都会被更新

# 3. 恢复软删除的数据
# 因为已经被软删除的数据会被 default_scope 过滤,所以需要使用 unscoped 查出
deleted_user = User.unscoped.find(1)
# 执行恢复操作,同样可以传入 user_id 记录是谁执行的恢复,并选择是否刷新 updated_at
deleted_user.restore(user_id: current_user.id, refresh_updated: true)
# 此时 user 的 is_deleted 变为 false,同时 deleted_at 和 deleted_by 会被清空,updated_by 会被更新

Author: