/
acts_as_paranoid.rb
65 lines (49 loc) · 1.82 KB
/
acts_as_paranoid.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# frozen_string_literal: true
require "active_record"
require "acts_as_paranoid/core"
require "acts_as_paranoid/associations"
require "acts_as_paranoid/validations"
require "acts_as_paranoid/relation"
module ActsAsParanoid
def paranoid?
included_modules.include?(ActsAsParanoid::Core)
end
def validates_as_paranoid
include ActsAsParanoid::Validations
end
def acts_as_paranoid(options = {})
if !options.is_a?(Hash) && !options.empty?
raise ArgumentError, "Hash expected, got #{options.class.name}"
end
class_attribute :paranoid_configuration
self.paranoid_configuration = {
column: "deleted_at",
column_type: "time",
recover_dependent_associations: true,
dependent_recovery_window: 2.minutes,
double_tap_destroys_fully: true
}
if options[:column_type] == "string"
paranoid_configuration.merge!(deleted_value: "deleted")
end
paranoid_configuration.merge!(options) # user options
unless %w[time boolean string].include? paranoid_configuration[:column_type]
raise ArgumentError,
"'time', 'boolean' or 'string' expected for :column_type option," \
" got #{paranoid_configuration[:column_type]}"
end
return if paranoid?
include ActsAsParanoid::Core
# Magic!
default_scope { where(paranoid_default_scope) }
define_deleted_time_scopes if paranoid_column_type == :time
end
end
# Extend ActiveRecord's functionality
ActiveRecord::Base.extend ActsAsParanoid
# Extend ActiveRecord::Base with paranoid associations
ActiveRecord::Base.include ActsAsParanoid::Associations
# Override ActiveRecord::Relation's behavior
ActiveRecord::Relation.include ActsAsParanoid::Relation
# Push the recover callback onto the activerecord callback list
ActiveRecord::Callbacks::CALLBACKS.push(:before_recover, :after_recover)