discourse/app/models/concerns/trashable.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

57 lines
1.4 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
module Trashable
extend ActiveSupport::Concern
included do
default_scope { where(with_deleted_scope_sql) }
2013-05-07 00:46:46 -04:00
# scope unscoped does not work
2013-07-09 15:20:18 -04:00
belongs_to :deleted_by, class_name: 'User'
end
module ClassMethods
def with_deleted
2013-05-07 00:46:46 -04: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 00:14:24 -04:00
scope = self.all
# must use :send here cause predicates is protected
# careful with updates of this API
scope.where_clause.send(:predicates).delete(with_deleted_scope_sql)
scope
end
def with_deleted_scope_sql
2014-02-17 11:44:28 -05:00
all.table[:deleted_at].eq(nil).to_sql
end
end
def trashed?
deleted_at.present?
end
2017-07-27 21:20:09 -04:00
def trash!(trashed_by = nil)
2013-05-07 00:50:02 -04: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))
end
def recover!
2013-07-09 15:20:18 -04:00
trash_update(nil, nil)
end
2013-07-09 15:20:18 -04:00
private
2018-06-07 01:28:18 -04:00
def trash_update(deleted_at, deleted_by_id)
self.update_columns(deleted_at: deleted_at, deleted_by_id: deleted_by_id)
end
2013-07-09 15:20:18 -04:00
end