recurse-delete 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/recurse-delete.rb +24 -20
  2. metadata +15 -4
@@ -1,4 +1,4 @@
1
- # Recurse Delete by John Isaacks (programming-perils.com)
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
- def recurse_delete(model_class=nil, ids=nil)
27
- ids = self.id if ids.nil?
28
- model_class = self.class if model_class.nil?
29
-
30
- # Delete self
31
- model_class.delete_all(:id => ids)
32
-
33
- # find and delete all dependent associations
34
- delete_assocs = [:delete_all,:delete,:destroy,:destroy_all]
35
- table_name = model_class.to_s.tableize
36
- model_class.reflect_on_all_associations.select do |assoc|
37
- delete_assocs.include? assoc.options[:dependent]
38
- end.map(&:name).each do |sub|
39
- sub_model_class = sub.to_s.classify.constantize
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.1
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-07-01 00:00:00.000000000 Z
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: &70171390191620 !ruby/object:Gem::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: *70171390191620
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: []