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.
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: []