Explicit soft deletion for ActiveRecord via deleted_at + callbacks and optional default scope.
Not overwriting destroy or delete.
gem install soft_deletion
require 'soft_deletion' class User < ActiveRecord::Base has_soft_deletion default_scope: true before_soft_delete :validate_deletability # soft_delete stops if this returns false after_soft_delete :send_deletion_emails has_many :products end # soft delete them including all soft-deletable dependencies that are marked as :destroy, :delete_all, :nullify user = User.first user.products.count == 10 user.soft_delete! user.deleted? # true # use special with_deleted scope to find them ... user.reload # ActiveRecord::RecordNotFound User.with_deleted do user.reload # there it is ... user.products.count == 0 end # soft undelete them all user.soft_undelete! user.products.count == 10 # soft delete many User.soft_delete_all!(1,2,3,4)
- nullify should use update_all on has_many on soft_delete (performance)
- has_many :through should delete join associations on soft_delete
- cascading soft_deletes should use the same timestamp for easy reverts