soft_deletion 1.2.1 → 1.6.0
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 +5 -5
- data/Readme.md +3 -3
- data/lib/soft_deletion/core.rb +18 -31
- data/lib/soft_deletion/dependency.rb +4 -9
- data/lib/soft_deletion/version.rb +1 -1
- metadata +9 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5ca056615af191c4edb5663f3b1c56067930777172ec9a02fe2b58180b7319ae
|
4
|
+
data.tar.gz: 214ea720e110dbde3fe8bd0e86c9a3a970abd48ae1e0001b339b8fbf2a06e408
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0152d17ffb4687a319e95de937f0205baf0fd310af7eb42d881f38654d64217b1fb6fd82c4a5a6b4b9a5a6c84c0e0d7f96bf1aae85d7d71385459ed40f63fc12
|
7
|
+
data.tar.gz: f1f871ef34ce9f46819ee2c02ca3333a8525d0ac90678fb7dd8069458b146e1a64bda07a43ce9b4cf537c7dbf21e86a443dea3bed263f86bde335d0f1060ff8a
|
data/Readme.md
CHANGED
@@ -26,7 +26,7 @@ end
|
|
26
26
|
# soft delete them including all soft-deletable dependencies that are marked as :destroy, :delete_all, :nullify
|
27
27
|
user = User.first
|
28
28
|
user.products.count == 10
|
29
|
-
user.soft_delete!
|
29
|
+
user.soft_delete!(validate: false)
|
30
30
|
user.deleted? # true
|
31
31
|
|
32
32
|
# use special with_deleted scope to find them ...
|
@@ -48,7 +48,6 @@ User.soft_delete_all!(1,2,3,4)
|
|
48
48
|
|
49
49
|
TODO
|
50
50
|
====
|
51
|
-
- nullify should use update_all on has_many on soft_delete (performance)
|
52
51
|
- has_many :through should delete join associations on soft_delete
|
53
52
|
- cascading soft_deletes should use the same timestamp for easy reverts
|
54
53
|
|
@@ -62,8 +61,9 @@ Authors
|
|
62
61
|
- [Noel Dellofano](https://github.com/pinkvelociraptor)
|
63
62
|
- [Oliver Nightingale](https://github.com/olivernn)
|
64
63
|
- [Kumar Pandya](https://github.com/kpandya91)
|
64
|
+
- [Alex Pauly](https://github.com/apauly)
|
65
65
|
|
66
66
|
[Zendesk](http://zendesk.com)<br/>
|
67
67
|
michael@grosser.it<br/>
|
68
68
|
License: MIT<br/>
|
69
|
-
|
69
|
+

|
data/lib/soft_deletion/core.rb
CHANGED
@@ -38,22 +38,14 @@ module SoftDeletion
|
|
38
38
|
models = ids_or_models
|
39
39
|
else
|
40
40
|
ids = ids_or_models
|
41
|
-
models =
|
42
|
-
where(:id => ids)
|
43
|
-
else
|
44
|
-
all(:conditions => { :id => ids })
|
45
|
-
end
|
41
|
+
models = where(:id => ids)
|
46
42
|
end
|
47
43
|
|
48
44
|
transaction do
|
49
|
-
|
50
|
-
where(:id => ids).update_all(mark_as_soft_deleted_sql)
|
51
|
-
else
|
52
|
-
update_all(mark_as_soft_deleted_sql, :id => ids)
|
53
|
-
end
|
45
|
+
where(:id => ids).update_all(mark_as_soft_deleted_sql)
|
54
46
|
|
55
47
|
models.each do |model|
|
56
|
-
model.soft_delete_dependencies.each(
|
48
|
+
model.soft_delete_dependencies.each { |dep| dep.execute_soft_delete(:soft_delete!, []) }
|
57
49
|
model.run_callbacks :soft_delete
|
58
50
|
end
|
59
51
|
end
|
@@ -73,11 +65,11 @@ module SoftDeletion
|
|
73
65
|
end
|
74
66
|
|
75
67
|
def soft_delete!(*args)
|
76
|
-
_run_soft_delete { save!(*args) } || soft_delete_hook_failed(:before_soft_delete)
|
68
|
+
_run_soft_delete(:soft_delete!, args) { save!(*args) } || soft_delete_hook_failed(:before_soft_delete)
|
77
69
|
end
|
78
70
|
|
79
71
|
def soft_delete(*args)
|
80
|
-
_run_soft_delete{ save(*args) }
|
72
|
+
_run_soft_delete(:soft_delete, args) { save(*args) }
|
81
73
|
end
|
82
74
|
|
83
75
|
def soft_undelete
|
@@ -94,16 +86,9 @@ module SoftDeletion
|
|
94
86
|
|
95
87
|
protected
|
96
88
|
|
97
|
-
if ActiveRecord::VERSION::MAJOR < 4
|
98
|
-
def each_counter_cached_associations
|
99
|
-
reflections.each do |name, reflection|
|
100
|
-
yield association(name.to_sym) if reflection.belongs_to? && reflection.counter_cache_column
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
89
|
def update_soft_delete_counter_caches(value)
|
106
90
|
each_counter_cached_associations do |association|
|
91
|
+
association.load_target unless association.loaded?
|
107
92
|
if association.target
|
108
93
|
target = association.target
|
109
94
|
target.class.update_counters(target.id, association.reflection.counter_cache_column => value)
|
@@ -111,19 +96,21 @@ module SoftDeletion
|
|
111
96
|
end
|
112
97
|
end
|
113
98
|
|
114
|
-
def _run_soft_delete(&block)
|
99
|
+
def _run_soft_delete(method, args, &block)
|
115
100
|
result = false
|
116
|
-
internal = lambda do
|
117
|
-
mark_as_deleted
|
118
|
-
soft_delete_dependencies.each(&:soft_delete!)
|
119
|
-
result = block.call
|
120
|
-
update_soft_delete_counter_caches(-1)
|
121
|
-
end
|
122
|
-
|
123
101
|
self.class.transaction do
|
102
|
+
internal = lambda do
|
103
|
+
mark_as_deleted
|
104
|
+
raise ActiveRecord::Rollback unless soft_delete_dependencies.all? { |dep| dep.execute_soft_delete(method, args) }
|
105
|
+
result = block.call
|
106
|
+
raise ActiveRecord::Rollback unless result
|
107
|
+
update_soft_delete_counter_caches(-1)
|
108
|
+
end
|
109
|
+
|
124
110
|
run_callbacks :soft_delete, &internal
|
125
|
-
end
|
126
111
|
|
112
|
+
result
|
113
|
+
end
|
127
114
|
result
|
128
115
|
end
|
129
116
|
|
@@ -134,7 +121,7 @@ module SoftDeletion
|
|
134
121
|
limit = deleted_at - 1.hour
|
135
122
|
internal = lambda do
|
136
123
|
mark_as_undeleted
|
137
|
-
soft_delete_dependencies.each { |m| m.soft_undelete!(limit)}
|
124
|
+
soft_delete_dependencies.each { |m| m.soft_undelete!(limit) }
|
138
125
|
result = block.call
|
139
126
|
update_soft_delete_counter_caches(1)
|
140
127
|
end
|
@@ -7,14 +7,15 @@ module SoftDeletion
|
|
7
7
|
@association_name = association_name
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
10
|
+
def execute_soft_delete(method, args)
|
11
11
|
case association.options[:dependent]
|
12
12
|
when :nullify
|
13
|
-
|
13
|
+
dependency.update_all(association.foreign_key => nil)
|
14
14
|
when :delete_all
|
15
15
|
dependency.update_all(dependency.mark_as_soft_deleted_sql)
|
16
|
+
true
|
16
17
|
else
|
17
|
-
dependencies.
|
18
|
+
dependencies.all? { |dep| dep.send(method, *args) }
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
@@ -26,12 +27,6 @@ module SoftDeletion
|
|
26
27
|
|
27
28
|
protected
|
28
29
|
|
29
|
-
def nullify_dependencies
|
30
|
-
dependencies.each do |dependency|
|
31
|
-
dependency.update_column(association.foreign_key, nil)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
30
|
def klass
|
36
31
|
association.klass
|
37
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soft_deletion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Michael Grosser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 4.2.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 6.2.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 4.2.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
32
|
+
version: 6.2.0
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: rake
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,20 +100,6 @@ dependencies:
|
|
100
100
|
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: wwtd
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - ">="
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
110
|
-
type: :development
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - ">="
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '0'
|
117
103
|
- !ruby/object:Gem::Dependency
|
118
104
|
name: single_cov
|
119
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -166,15 +152,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
166
152
|
requirements:
|
167
153
|
- - ">="
|
168
154
|
- !ruby/object:Gem::Version
|
169
|
-
version: 2.
|
155
|
+
version: 2.5.0
|
170
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
157
|
requirements:
|
172
158
|
- - ">="
|
173
159
|
- !ruby/object:Gem::Version
|
174
160
|
version: '0'
|
175
161
|
requirements: []
|
176
|
-
|
177
|
-
rubygems_version: 2.5.1
|
162
|
+
rubygems_version: 3.1.3
|
178
163
|
signing_key:
|
179
164
|
specification_version: 4
|
180
165
|
summary: Explicit soft deletion for ActiveRecord via deleted_at and default scope.
|