intro_rails

假删除

添加deleted_at到需要假删除的模型上。

app/models/concerns/soft_deletable.rb

module SoftDeletable
  extend ActiveSupport::Concern

  included do
    scope :deleted, -> { where.not(deleted_at: nil) }
    scope :without_deleted, -> { where(deleted_at: nil) }
    scope :with_deleted, -> { unscope(where: :deleted_at) }

    default_scope { without_deleted }
  end

  def destroy(mode = :soft)
    if mode == :hard
      super()
    else
      update(deleted_at: Time.zone.now)
    end
  end

  def restore
    update(deleted_at: nil)
  end

  def deleted?
    deleted_at?
  end
end

把需要假删除的模型引入假删除的 concerns,include SoftDeletable