recurse-delete 0.0.1 → 0.0.3
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.
- data/lib/recurse-delete.rb +24 -20
- metadata +15 -4
data/lib/recurse-delete.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Recurse Delete by
|
1
|
+
# Recurse Delete by JD Isaacks (jisaacks.com)
|
2
2
|
#
|
3
3
|
# Copyright (c) 2012 John Isaacks
|
4
4
|
#
|
@@ -21,29 +21,33 @@
|
|
21
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
23
|
|
24
|
+
require 'valium'
|
25
|
+
|
24
26
|
module RecurseDelete
|
27
|
+
def recurse_delete
|
28
|
+
delete_recursively self.class, self.id
|
29
|
+
end
|
30
|
+
|
31
|
+
def delete_recursively(parent_class, parent_ids)
|
32
|
+
# delete all the parent records
|
33
|
+
parent_class.delete_all(:id => parent_ids)
|
25
34
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
sub_ids = sub_model_class.send("find_all_by_#{table_name.classify.foreign_key}", ids).map(&:id)
|
41
|
-
recurse_delete(sub_model_class, sub_ids)
|
35
|
+
# get the foreign key for the parent class
|
36
|
+
parent_key = parent_class.to_s.foreign_key
|
37
|
+
|
38
|
+
# get the assocs for the parent class
|
39
|
+
assocs = parent_class.reflect_on_all_associations.select do |assoc|
|
40
|
+
[:destroy, :destroy_all, :delete, :delete_all].include? assoc.options[:dependent]
|
41
|
+
end
|
42
|
+
assocs.map(&:name).each do |assoc|
|
43
|
+
# get the dependent class
|
44
|
+
dependent_class = assoc.to_s.classify.constantize
|
45
|
+
# get all the dependent record ids
|
46
|
+
dependent_ids = dependent_class.where(parent_key => parent_ids).value_of(:id)
|
47
|
+
# recurse
|
48
|
+
delete_recursively(dependent_class, dependent_ids)
|
42
49
|
end
|
43
|
-
|
44
|
-
self
|
45
50
|
end
|
46
|
-
|
47
51
|
end
|
48
52
|
|
49
53
|
class ActiveRecord::Base
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: recurse-delete
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &70238368835880 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,18 @@ dependencies:
|
|
21
21
|
version: 3.2.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70238368835880
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: valium
|
27
|
+
requirement: &70238368834720 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70238368834720
|
25
36
|
description: Recursively delete all dependent model associations without an N + 1
|
26
37
|
email: john.isaacks@programming-perils.com
|
27
38
|
executables: []
|