2019-05-03 08:17:27 +10:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2013-05-07 14:39:01 +10:00
|
|
|
module Trashable
|
|
|
|
extend ActiveSupport::Concern
|
|
|
|
|
|
|
|
included do
|
2013-08-15 17:52:18 +02:00
|
|
|
default_scope { where(with_deleted_scope_sql) }
|
2013-05-07 14:46:46 +10:00
|
|
|
|
|
|
|
# scope unscoped does not work
|
2013-07-09 15:20:18 -04:00
|
|
|
belongs_to :deleted_by, class_name: 'User'
|
2013-05-07 14:39:01 +10:00
|
|
|
end
|
|
|
|
|
|
|
|
module ClassMethods
|
|
|
|
def with_deleted
|
2013-05-07 14:46:46 +10:00
|
|
|
# lifted from acts_as_paranoid, works around https://github.com/rails/rails/issues/4306
|
|
|
|
#
|
|
|
|
# with this in place Post.limit(10).with_deleted, will work as expected
|
|
|
|
#
|
2014-05-08 14:14:24 +10:00
|
|
|
scope = self.all
|
2013-08-16 14:53:40 +02:00
|
|
|
|
2019-05-07 11:57:55 +10:00
|
|
|
# must use :send here cause predicates is protected
|
|
|
|
# careful with updates of this API
|
2017-08-31 12:06:56 +08:00
|
|
|
scope.where_clause.send(:predicates).delete(with_deleted_scope_sql)
|
2013-05-07 14:39:01 +10:00
|
|
|
scope
|
|
|
|
end
|
|
|
|
|
|
|
|
def with_deleted_scope_sql
|
2014-02-17 17:44:28 +01:00
|
|
|
all.table[:deleted_at].eq(nil).to_sql
|
2013-05-07 14:39:01 +10:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-07-11 16:38:46 -04:00
|
|
|
def trashed?
|
|
|
|
deleted_at.present?
|
|
|
|
end
|
|
|
|
|
2013-07-09 15:20:18 -04:00
|
|
|
def trash!(trashed_by = nil)
|
2013-05-07 14:50:02 +10:00
|
|
|
# note, an argument could be made that the column should probably called trashed_at
|
|
|
|
# however, deleted_at is the terminology used in the UI
|
|
|
|
#
|
|
|
|
# we could hijack use a delete! and delete - redirecting the originals elsewhere, but that is
|
|
|
|
# confusing as well. So for now, we go with trash!
|
|
|
|
#
|
2013-07-09 15:20:18 -04:00
|
|
|
trash_update(DateTime.now, trashed_by.try(:id))
|
2013-05-07 14:39:01 +10:00
|
|
|
end
|
|
|
|
|
|
|
|
def recover!
|
2013-07-09 15:20:18 -04:00
|
|
|
trash_update(nil, nil)
|
2013-05-07 14:39:01 +10:00
|
|
|
end
|
|
|
|
|
2013-07-09 15:20:18 -04:00
|
|
|
private
|
|
|
|
|
|
|
|
def trash_update(deleted_at, deleted_by_id)
|
2018-06-05 17:29:17 +10:00
|
|
|
self.update_columns(deleted_at: deleted_at, deleted_by_id: deleted_by_id)
|
2013-07-09 15:20:18 -04:00
|
|
|
end
|
|
|
|
|
2013-05-07 14:39:01 +10:00
|
|
|
end
|