Module: Paranoia
- Defined in:
- lib/paranoia.rb,
lib/paranoia/version.rb
Defined Under Namespace
Modules: Callbacks, Query
Constant Summary
collapse
- VERSION =
'2.3.1'.freeze
- @@default_sentinel_value =
nil
Class Method Summary
collapse
Instance Method Summary
collapse
Class Method Details
.default_sentinel_value ⇒ Object
11
12
13
|
# File 'lib/paranoia.rb', line 11
def self.default_sentinel_value
@@default_sentinel_value
end
|
.default_sentinel_value=(val) ⇒ Object
Change default_sentinel_value in a rails initializer
7
8
9
|
# File 'lib/paranoia.rb', line 7
def self.default_sentinel_value=(val)
@@default_sentinel_value = val
end
|
.included(klazz) ⇒ Object
15
16
17
18
|
# File 'lib/paranoia.rb', line 15
def self.included(klazz)
klazz.extend Query
klazz.extend Callbacks
end
|
Instance Method Details
#delete ⇒ Object
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'lib/paranoia.rb', line 94
def delete
raise ActiveRecord::ReadOnlyRecord, "#{self.class} is marked as readonly" if readonly?
if persisted?
add_to_transaction
update_columns(paranoia_destroy_attributes)
elsif !frozen?
assign_attributes(paranoia_destroy_attributes)
end
self
end
|
#destroy ⇒ Object
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/paranoia.rb', line 76
def destroy
transaction do
run_callbacks(:destroy) do
@_disable_counter_cache = deleted?
result = delete
next result unless result && ActiveRecord::VERSION::STRING >= '4.2'
each_counter_cached_associations do |association|
foreign_key = association.reflection.foreign_key.to_sym
next if destroyed_by_association && destroyed_by_association.foreign_key.to_sym == foreign_key
next unless send(association.reflection.name)
association.decrement_counters
end
@_disable_counter_cache = false
result
end
end
end
|
#get_recovery_window_range(opts) ⇒ Object
133
134
135
136
137
|
# File 'lib/paranoia.rb', line 133
def get_recovery_window_range(opts)
return opts[:recovery_window_range] if opts[:recovery_window_range]
return unless opts[:recovery_window]
(deleted_at - opts[:recovery_window]..deleted_at + opts[:recovery_window])
end
|
#paranoia_destroyed? ⇒ Boolean
Also known as:
deleted?
144
145
146
|
# File 'lib/paranoia.rb', line 144
def paranoia_destroyed?
send(paranoia_column) != paranoia_sentinel_value
end
|
#really_destroy! ⇒ Object
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
# File 'lib/paranoia.rb', line 149
def really_destroy!
transaction do
run_callbacks(:real_destroy) do
@_disable_counter_cache = deleted?
dependent_reflections = self.class.reflections.select do |name, reflection|
reflection.options[:dependent] == :destroy
end
if dependent_reflections.any?
dependent_reflections.each do |name, reflection|
association_data = self.send(name)
next unless association_data && association_data.paranoid?
if reflection.collection?
next association_data.with_deleted.each(&:really_destroy!)
end
association_data.really_destroy!
end
end
write_attribute(paranoia_column, current_time_from_proper_timezone)
destroy_without_paranoia
end
end
end
|
#restore!(opts = {}) ⇒ Object
Also known as:
restore
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# File 'lib/paranoia.rb', line 107
def restore!(opts = {})
self.class.transaction do
run_callbacks(:restore) do
recovery_window_range = get_recovery_window_range(opts)
noop_if_frozen = ActiveRecord.version < Gem::Version.new("4.1")
if within_recovery_window?(recovery_window_range) && ((noop_if_frozen && !@attributes.frozen?) || !noop_if_frozen)
@_disable_counter_cache = !deleted?
write_attribute paranoia_column, paranoia_sentinel_value
update_columns(paranoia_restore_attributes)
each_counter_cached_associations do |association|
if send(association.reflection.name)
association.increment_counters
end
end
@_disable_counter_cache = false
end
restore_associated_records(recovery_window_range) if opts[:recursive]
end
end
self
end
|
#within_recovery_window?(recovery_window_range) ⇒ Boolean
139
140
141
142
|
# File 'lib/paranoia.rb', line 139
def within_recovery_window?(recovery_window_range)
return true unless recovery_window_range
recovery_window_range.cover?(deleted_at)
end
|