acts_as_paranoid 0.7.2 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +57 -0
- data/CONTRIBUTING.md +22 -11
- data/README.md +3 -3
- data/lib/acts_as_paranoid/association_reflection.rb +41 -0
- data/lib/acts_as_paranoid/associations.rb +32 -19
- data/lib/acts_as_paranoid/core.rb +74 -51
- data/lib/acts_as_paranoid/relation.rb +1 -1
- data/lib/acts_as_paranoid/version.rb +1 -1
- data/lib/acts_as_paranoid.rb +7 -7
- metadata +65 -61
- data/test/test_associations.rb +0 -358
- data/test/test_core.rb +0 -679
- data/test/test_default_scopes.rb +0 -53
- data/test/test_helper.rb +0 -565
- data/test/test_inheritance.rb +0 -16
- data/test/test_relations.rb +0 -125
- data/test/test_validations.rb +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be004bb0de25cdda73697fa22c07d0a64e1d98c071506d4b0a608a3d3231e103
|
4
|
+
data.tar.gz: 9334fe5730d07f94d087f3e6f1d4803126224a4106cc378d9f6263fc15295d93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3e7ebd79d467118c9c91374088f3fe3a203ae6ca914fa036646fb77e7f4c1c9ba4e1c653dc2311ac1bd53bbf2517cb1a00ee06b32e0f09d6937bfb1ea8f6247
|
7
|
+
data.tar.gz: 99c7d3d41d9a94b26d2fed6ce5b01ea2fddfbc09bd958d9ca990a7b2d92c466a876e23011db5f7fda02b4efb9cd417b9a8dfe62a432757e788e7a89c898dbcd0
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,43 @@
|
|
2
2
|
|
3
3
|
Notable changes to this project will be documented in this file.
|
4
4
|
|
5
|
+
## 0.8.1
|
6
|
+
|
7
|
+
* Officially support Ruby 3.1 ([#268], by [Matijs van Zuijlen][mvz])
|
8
|
+
* Fix association building for `belongs_to` with `:with_deleted` option ([#277], by [Matijs van Zuijlen][mvz])
|
9
|
+
|
10
|
+
## 0.8.0
|
11
|
+
|
12
|
+
* Do not set `paranoid_value` when destroying fully ([#238], by [Aymeric Le Dorze][aymeric-ledorze])
|
13
|
+
* Make helper methods for dependent associations private ([#239], by [Matijs van Zuijlen][mvz])
|
14
|
+
* Raise ActiveRecord::RecordNotDestroyed if destroy returns false ([#240], by [Hao Liu][leomayleomay])
|
15
|
+
* Make unscoping by `with_deleted` less blunt ([#241], by [Matijs van Zuijlen][mvz])
|
16
|
+
* Drop support for Ruby 2.4 and 2.5 ([#243] and [#245] by [Matijs van Zuijlen][mvz])
|
17
|
+
* Remove deprecated methods ([#244] by [Matijs van Zuijlen][mvz])
|
18
|
+
* Remove test files from the gem ([#261] by [Matijs van Zuijlen][mvz])
|
19
|
+
* Add support for Rails 7 ([#262] by [Vederis Leunardus][cloudsbird])
|
20
|
+
|
21
|
+
## 0.7.3
|
22
|
+
|
23
|
+
## Improvements
|
24
|
+
|
25
|
+
* Fix deletion time scopes ([#212] by [Matijs van Zuijlen][mvz])
|
26
|
+
* Reload `has_one` associations after dependent recovery ([#214],
|
27
|
+
by [Matijs van Zuijlen][mvz])
|
28
|
+
* Make dependent recovery work when parent is non-optional ([#227],
|
29
|
+
by [Matijs van Zuijlen][mvz])
|
30
|
+
* Avoid querying nil `belongs_to` associations when recovering ([#219],
|
31
|
+
by [Matijs van Zuijlen][mvz])
|
32
|
+
* On relations, deprecate `destroy!` in favour of `destroy_fully!` ([#222],
|
33
|
+
by [Matijs van Zuijlen][mvz])
|
34
|
+
* Deprecate the undocumented `:recovery_value` setting. Calculate the correct
|
35
|
+
value instead. ([#220], by [Matijs van Zuijlen][mvz])
|
36
|
+
|
37
|
+
## Developer experience
|
38
|
+
|
39
|
+
* Log ActiveRecord activity to a visible log during tests ([#218],
|
40
|
+
by [Matijs van Zuijlen][mvz])
|
41
|
+
|
5
42
|
## 0.7.2
|
6
43
|
|
7
44
|
* Do not set boolean column to NULL on recovery if nulls are not allowed
|
@@ -83,10 +120,12 @@ Notable changes to this project will be documented in this file.
|
|
83
120
|
[AlexWheeler]: https://github.com/AlexWheeler
|
84
121
|
[RomainAlexandre]: https://github.com/RomainAlexandre
|
85
122
|
[avinoth]: https://github.com/avinoth
|
123
|
+
[cloudsbird]: https://github.com/cloudsbird
|
86
124
|
[aymeric-ledorze]: https://github.com/aymeric-ledorze
|
87
125
|
[danielricecodes]: https://github.com/danielricecodes
|
88
126
|
[jbryant92]: https://github.com/jbryant92
|
89
127
|
[kevinmcalear]: https://github.com/kevinmcalear
|
128
|
+
[leomayleomay]: https://github.com/leomayleomay
|
90
129
|
[marycodes2]: https://github.com/marycodes2
|
91
130
|
[mvz]: https://github.com/mvz
|
92
131
|
[nedcampion]: https://github.com/nedcampion
|
@@ -100,6 +139,24 @@ Notable changes to this project will be documented in this file.
|
|
100
139
|
|
101
140
|
<!-- issues & pull requests -->
|
102
141
|
|
142
|
+
[#277]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/277
|
143
|
+
[#268]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/268
|
144
|
+
[#262]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/262
|
145
|
+
[#261]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/261
|
146
|
+
[#245]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/245
|
147
|
+
[#244]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/244
|
148
|
+
[#243]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/243
|
149
|
+
[#241]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/241
|
150
|
+
[#240]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/240
|
151
|
+
[#239]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/239
|
152
|
+
[#238]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/238
|
153
|
+
[#227]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/227
|
154
|
+
[#222]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/222
|
155
|
+
[#220]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/220
|
156
|
+
[#219]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/219
|
157
|
+
[#218]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/218
|
158
|
+
[#214]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/214
|
159
|
+
[#212]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/212
|
103
160
|
[#209]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/209
|
104
161
|
[#208]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/208
|
105
162
|
[#207]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/207
|
data/CONTRIBUTING.md
CHANGED
@@ -5,10 +5,10 @@ help the process of handling issues and pull requests go smoothly.
|
|
5
5
|
|
6
6
|
## Issues
|
7
7
|
|
8
|
-
When creating an issue, please
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
When creating an issue, please provide as much information as possible, and
|
9
|
+
follow the guidelines below to make it easier for us to figure out what's going
|
10
|
+
on. If you miss any of these points we will probably ask you to improve the
|
11
|
+
ticket.
|
12
12
|
|
13
13
|
- Include a clear title describing the problem
|
14
14
|
- Describe what you are trying to achieve
|
@@ -25,20 +25,31 @@ GitHub issue for it before trying to implement it yourself. That way, we can
|
|
25
25
|
discuss the feature and whether it makes sense to include in ActsAsParanoid itself
|
26
26
|
before putting in the work to implement it.
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
To send pull requests or patches, please follow the instructions below.
|
29
|
+
**If you get stuck, please make a pull request anyway and we'll try to
|
30
30
|
help out.**
|
31
31
|
|
32
|
-
- Make sure `rake
|
32
|
+
- Make sure `bundle exec rake` runs without reporting any failures.
|
33
33
|
- Add tests for your feature. Otherwise, we can't see if it works or if we
|
34
34
|
break it later.
|
35
|
-
-
|
36
|
-
|
37
|
-
|
38
|
-
same commit.
|
35
|
+
- Create a separate branch for your feature based off of latest master.
|
36
|
+
- Do not include changes that are irrelevant to your feature in the same
|
37
|
+
commit.
|
39
38
|
- Keep an eye on the build results in GitHub Actions. If the build fails and it
|
40
39
|
seems due to your changes, please update your pull request with a fix.
|
41
40
|
|
41
|
+
### Testing your changes
|
42
|
+
|
43
|
+
You can run the test suite with the latest version of all dependencies by running the following:
|
44
|
+
|
45
|
+
- Run `bundle install` if you haven't done so already, or `bundle update` to update the dependencies
|
46
|
+
- Run `bundle exec rake` to run the tests
|
47
|
+
|
48
|
+
To run the tests suite for a particular version of ActiveRecord use
|
49
|
+
[appraisal](https://github.com/thoughtbot/appraisal). For example, to run the
|
50
|
+
specs with ActiveRecord 6.1, run `appraisal active_record_61 rake`. See appraisal's
|
51
|
+
documentation for details.
|
52
|
+
|
42
53
|
### The review process
|
43
54
|
|
44
55
|
- We will try to review your pull request as soon as possible but we can make no
|
data/README.md
CHANGED
@@ -9,9 +9,9 @@ recoverable later.
|
|
9
9
|
|
10
10
|
## Support
|
11
11
|
|
12
|
-
**This branch targets Rails 5.2+ and Ruby 2.
|
12
|
+
**This branch targets Rails 5.2+ and Ruby 2.5+ only**
|
13
13
|
|
14
|
-
If you're working with Rails 5.1 and earlier, or with Ruby 2.
|
14
|
+
If you're working with Rails 5.1 and earlier, or with Ruby 2.4 or earlier,
|
15
15
|
please switch to the corresponding branch or require an older version of the
|
16
16
|
`acts_as_paranoid` gem.
|
17
17
|
|
@@ -27,7 +27,7 @@ please switch to the corresponding branch or require an older version of the
|
|
27
27
|
#### Install gem:
|
28
28
|
|
29
29
|
```ruby
|
30
|
-
gem 'acts_as_paranoid'
|
30
|
+
gem 'acts_as_paranoid'
|
31
31
|
```
|
32
32
|
|
33
33
|
```shell
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActsAsParanoid
|
4
|
+
# Override for ActiveRecord::Reflection::AssociationReflection
|
5
|
+
#
|
6
|
+
# This makes automatic finding of inverse associations work where the
|
7
|
+
# inverse is a belongs_to association with the :with_deleted option set.
|
8
|
+
#
|
9
|
+
# Specifying :with_deleted for the belongs_to association would stop the
|
10
|
+
# inverse from being calculated because it sets scope where there was none,
|
11
|
+
# and normally an association having a scope means ActiveRecord will not
|
12
|
+
# automatically find the inverse association.
|
13
|
+
#
|
14
|
+
# This override adds an exception to that rule only for the case where the
|
15
|
+
# scope was added just to support the :with_deleted option.
|
16
|
+
module AssociationReflection
|
17
|
+
if ActiveRecord::VERSION::MAJOR < 7
|
18
|
+
def can_find_inverse_of_automatically?(reflection)
|
19
|
+
options = reflection.options
|
20
|
+
|
21
|
+
if reflection.macro == :belongs_to && options[:with_deleted]
|
22
|
+
return false if options[:inverse_of] == false
|
23
|
+
return false if options[:foreign_key]
|
24
|
+
|
25
|
+
!options.fetch(:original_scope)
|
26
|
+
else
|
27
|
+
super
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
def scope_allows_automatic_inverse_of?(reflection, inverse_reflection)
|
32
|
+
if reflection.scope
|
33
|
+
options = reflection.options
|
34
|
+
return true if options[:with_deleted] && !options.fetch(:original_scope)
|
35
|
+
end
|
36
|
+
|
37
|
+
super
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -19,32 +19,45 @@ module ActsAsParanoid
|
|
19
19
|
|
20
20
|
with_deleted = options.delete(:with_deleted)
|
21
21
|
if with_deleted
|
22
|
-
|
23
|
-
|
24
|
-
scope = proc do |*args|
|
25
|
-
if old_scope.arity == 0
|
26
|
-
instance_exec(&old_scope).with_deleted
|
27
|
-
else
|
28
|
-
old_scope.call(*args).with_deleted
|
29
|
-
end
|
30
|
-
end
|
31
|
-
else
|
32
|
-
scope = proc do
|
33
|
-
if respond_to? :with_deleted
|
34
|
-
self.with_deleted
|
35
|
-
else
|
36
|
-
all
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
22
|
+
original_scope = scope
|
23
|
+
scope = make_scope_with_deleted(scope)
|
40
24
|
end
|
41
25
|
|
42
26
|
result = belongs_to_without_deleted(target, scope, **options)
|
43
27
|
|
44
|
-
|
28
|
+
if with_deleted
|
29
|
+
options = result.values.last.options
|
30
|
+
options[:with_deleted] = with_deleted
|
31
|
+
options[:original_scope] = original_scope
|
32
|
+
end
|
45
33
|
|
46
34
|
result
|
47
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def make_scope_with_deleted(scope)
|
40
|
+
if scope
|
41
|
+
old_scope = scope
|
42
|
+
scope = proc do |*args|
|
43
|
+
if old_scope.arity == 0
|
44
|
+
instance_exec(&old_scope).with_deleted
|
45
|
+
else
|
46
|
+
old_scope.call(*args).with_deleted
|
47
|
+
end
|
48
|
+
end
|
49
|
+
else
|
50
|
+
scope = proc do
|
51
|
+
if respond_to? :with_deleted
|
52
|
+
with_deleted
|
53
|
+
else
|
54
|
+
all
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
scope
|
60
|
+
end
|
48
61
|
end
|
49
62
|
end
|
50
63
|
end
|
@@ -88,6 +88,14 @@ module ActsAsParanoid
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
+
def recovery_value
|
92
|
+
if boolean_type_not_nullable?
|
93
|
+
false
|
94
|
+
else
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
91
99
|
protected
|
92
100
|
|
93
101
|
def define_deleted_time_scopes
|
@@ -96,19 +104,25 @@ module ActsAsParanoid
|
|
96
104
|
}
|
97
105
|
|
98
106
|
scope :deleted_after_time, lambda { |time|
|
99
|
-
|
107
|
+
only_deleted
|
108
|
+
.where("#{table_name}.#{paranoid_column} > ?", time)
|
100
109
|
}
|
101
110
|
scope :deleted_before_time, lambda { |time|
|
102
|
-
|
111
|
+
only_deleted
|
112
|
+
.where("#{table_name}.#{paranoid_column} < ?", time)
|
103
113
|
}
|
104
114
|
end
|
105
115
|
|
106
116
|
def without_paranoid_default_scope
|
107
117
|
scope = all
|
108
118
|
|
119
|
+
# unscope avoids applying the default scope when using this scope for associations
|
109
120
|
scope = scope.unscope(where: paranoid_column)
|
110
|
-
|
111
|
-
|
121
|
+
|
122
|
+
paranoid_where_clause =
|
123
|
+
ActiveRecord::Relation::WhereClause.new([paranoid_default_scope])
|
124
|
+
|
125
|
+
scope.where_clause = all.where_clause - paranoid_where_clause
|
112
126
|
|
113
127
|
scope
|
114
128
|
end
|
@@ -142,7 +156,6 @@ module ActsAsParanoid
|
|
142
156
|
decrement_counters_on_associations
|
143
157
|
end
|
144
158
|
|
145
|
-
stale_paranoid_value
|
146
159
|
@destroyed = true
|
147
160
|
freeze
|
148
161
|
end
|
@@ -150,6 +163,12 @@ module ActsAsParanoid
|
|
150
163
|
end
|
151
164
|
|
152
165
|
def destroy!
|
166
|
+
destroy || raise(
|
167
|
+
ActiveRecord::RecordNotDestroyed.new("Failed to destroy the record", self)
|
168
|
+
)
|
169
|
+
end
|
170
|
+
|
171
|
+
def destroy
|
153
172
|
if !deleted?
|
154
173
|
with_transaction_returning_status do
|
155
174
|
run_callbacks :destroy do
|
@@ -172,8 +191,6 @@ module ActsAsParanoid
|
|
172
191
|
end
|
173
192
|
end
|
174
193
|
|
175
|
-
alias destroy destroy!
|
176
|
-
|
177
194
|
def recover(options = {})
|
178
195
|
return if !deleted?
|
179
196
|
|
@@ -185,16 +202,16 @@ module ActsAsParanoid
|
|
185
202
|
|
186
203
|
self.class.transaction do
|
187
204
|
run_callbacks :recover do
|
188
|
-
if options[:recursive]
|
189
|
-
recover_dependent_associations(options[:recovery_window], options)
|
190
|
-
end
|
191
205
|
increment_counters_on_associations
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
206
|
+
deleted_value = paranoid_value
|
207
|
+
self.paranoid_value = self.class.recovery_value
|
208
|
+
result = if options[:raise_error]
|
209
|
+
save!
|
210
|
+
else
|
211
|
+
save
|
212
|
+
end
|
213
|
+
recover_dependent_associations(deleted_value, options) if options[:recursive]
|
214
|
+
result
|
198
215
|
end
|
199
216
|
end
|
200
217
|
end
|
@@ -205,34 +222,6 @@ module ActsAsParanoid
|
|
205
222
|
recover(options)
|
206
223
|
end
|
207
224
|
|
208
|
-
def recover_dependent_associations(window, options)
|
209
|
-
self.class.dependent_associations.each do |reflection|
|
210
|
-
next unless (klass = get_reflection_class(reflection)).paranoid?
|
211
|
-
|
212
|
-
scope = klass.only_deleted.merge(get_association_scope(reflection: reflection))
|
213
|
-
|
214
|
-
# We can only recover by window if both parent and dependant have a
|
215
|
-
# paranoid column type of :time.
|
216
|
-
if self.class.paranoid_column_type == :time && klass.paranoid_column_type == :time
|
217
|
-
scope = scope.deleted_inside_time_window(paranoid_value, window)
|
218
|
-
end
|
219
|
-
|
220
|
-
scope.each do |object|
|
221
|
-
object.recover(options)
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
def destroy_dependent_associations!
|
227
|
-
self.class.dependent_associations.each do |reflection|
|
228
|
-
next unless (klass = get_reflection_class(reflection)).paranoid?
|
229
|
-
|
230
|
-
klass
|
231
|
-
.only_deleted.merge(get_association_scope(reflection: reflection))
|
232
|
-
.each(&:destroy!)
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
225
|
def deleted?
|
237
226
|
return true if @destroyed
|
238
227
|
|
@@ -255,18 +244,52 @@ module ActsAsParanoid
|
|
255
244
|
|
256
245
|
private
|
257
246
|
|
258
|
-
def
|
259
|
-
|
247
|
+
def recover_dependent_associations(deleted_value, options)
|
248
|
+
self.class.dependent_associations.each do |reflection|
|
249
|
+
recover_dependent_association(reflection, deleted_value, options)
|
250
|
+
end
|
260
251
|
end
|
261
252
|
|
262
|
-
def
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
253
|
+
def destroy_dependent_associations!
|
254
|
+
self.class.dependent_associations.each do |reflection|
|
255
|
+
assoc = association(reflection.name)
|
256
|
+
next unless (klass = assoc.klass).paranoid?
|
257
|
+
|
258
|
+
klass
|
259
|
+
.only_deleted.merge(get_association_scope(assoc))
|
260
|
+
.each(&:destroy!)
|
267
261
|
end
|
268
262
|
end
|
269
263
|
|
264
|
+
def recover_dependent_association(reflection, deleted_value, options)
|
265
|
+
assoc = association(reflection.name)
|
266
|
+
return unless (klass = assoc.klass).paranoid?
|
267
|
+
|
268
|
+
if reflection.belongs_to? && attributes[reflection.association_foreign_key].nil?
|
269
|
+
return
|
270
|
+
end
|
271
|
+
|
272
|
+
scope = klass.only_deleted.merge(get_association_scope(assoc))
|
273
|
+
|
274
|
+
# We can only recover by window if both parent and dependant have a
|
275
|
+
# paranoid column type of :time.
|
276
|
+
if self.class.paranoid_column_type == :time && klass.paranoid_column_type == :time
|
277
|
+
scope = scope.deleted_inside_time_window(deleted_value, options[:recovery_window])
|
278
|
+
end
|
279
|
+
|
280
|
+
recovered = false
|
281
|
+
scope.each do |object|
|
282
|
+
object.recover(options)
|
283
|
+
recovered = true
|
284
|
+
end
|
285
|
+
|
286
|
+
assoc.reload if recovered && reflection.has_one? && assoc.loaded?
|
287
|
+
end
|
288
|
+
|
289
|
+
def get_association_scope(dependent_association)
|
290
|
+
ActiveRecord::Associations::AssociationScope.scope(dependent_association)
|
291
|
+
end
|
292
|
+
|
270
293
|
def paranoid_value=(value)
|
271
294
|
write_attribute(self.class.paranoid_column, value)
|
272
295
|
end
|
data/lib/acts_as_paranoid.rb
CHANGED
@@ -5,6 +5,7 @@ require "acts_as_paranoid/core"
|
|
5
5
|
require "acts_as_paranoid/associations"
|
6
6
|
require "acts_as_paranoid/validations"
|
7
7
|
require "acts_as_paranoid/relation"
|
8
|
+
require "acts_as_paranoid/association_reflection"
|
8
9
|
|
9
10
|
module ActsAsParanoid
|
10
11
|
def paranoid?
|
@@ -27,22 +28,18 @@ module ActsAsParanoid
|
|
27
28
|
column_type: "time",
|
28
29
|
recover_dependent_associations: true,
|
29
30
|
dependent_recovery_window: 2.minutes,
|
30
|
-
recovery_value: nil,
|
31
31
|
double_tap_destroys_fully: true
|
32
32
|
}
|
33
33
|
if options[:column_type] == "string"
|
34
34
|
paranoid_configuration.merge!(deleted_value: "deleted")
|
35
|
-
elsif options[:column_type] == "boolean" && !options[:allow_nulls]
|
36
|
-
paranoid_configuration.merge!(recovery_value: false)
|
37
|
-
elsif options[:column_type] == "boolean"
|
38
|
-
paranoid_configuration.merge!(allow_nulls: true)
|
39
35
|
end
|
40
36
|
|
41
37
|
paranoid_configuration.merge!(options) # user options
|
42
38
|
|
43
39
|
unless %w[time boolean string].include? paranoid_configuration[:column_type]
|
44
|
-
raise ArgumentError,
|
45
|
-
|
40
|
+
raise ArgumentError,
|
41
|
+
"'time', 'boolean' or 'string' expected for :column_type option," \
|
42
|
+
" got #{paranoid_configuration[:column_type]}"
|
46
43
|
end
|
47
44
|
|
48
45
|
return if paranoid?
|
@@ -67,3 +64,6 @@ ActiveRecord::Relation.include ActsAsParanoid::Relation
|
|
67
64
|
|
68
65
|
# Push the recover callback onto the activerecord callback list
|
69
66
|
ActiveRecord::Callbacks::CALLBACKS.push(:before_recover, :after_recover)
|
67
|
+
|
68
|
+
ActiveRecord::Reflection::AssociationReflection
|
69
|
+
.prepend ActsAsParanoid::AssociationReflection
|