delete_recursively 0.9.0 → 0.9.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/delete_recursively.rb +37 -27
  3. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fe5f313a4d9cd27cdbca3504b2d16966c1ed6623
4
- data.tar.gz: 7e8c2c76945859371ffbb9c879524da9818adc27
3
+ metadata.gz: bd2146ffda7f8e2d85bd1855236af99dfb2c8e57
4
+ data.tar.gz: 3a854c4d3ed39014d7067992eb7d19a45e4adeff
5
5
  SHA512:
6
- metadata.gz: c956f74f5e3609590015f894b385d467d2030193cae1dfdb4fc5c464d496cc5ec38c3815370fae123344473ab8a4be81dfd624ea122bcc65053b2965db9d17c4
7
- data.tar.gz: bc23908040c1f20046e07a912a1841fb1e4c18902d12500927811971af31bbc6535779d67b87a0d972e6afd892397fdec0fe2fa2c2c64c13aa93dae7328949d2
6
+ metadata.gz: 834e49d0615645ed223225b17cdeeba1942afb985e8cadcb374c702d087fc95a3bbff438c707e44b5b011871faf8c957588b456653b38b82a3eb0eeb0176c2fd
7
+ data.tar.gz: 5f1d4fc60c57309329ea5686323553cf6738556175b06755346b860fa4faea1fea2928769349b301947acbae97b8ebd4e9e5cea1014ac8ba597b63d14eca743e
@@ -7,55 +7,65 @@ module DeleteRecursively
7
7
  NEW_DEPENDENT_OPTION = :delete_recursively
8
8
 
9
9
  # override ::valid_dependent_options to make the new
10
- # dependent option available to association builders
10
+ # dependent option available to Association::Builder classes
11
11
  module OptionPermission
12
12
  def valid_dependent_options
13
13
  super + [NEW_DEPENDENT_OPTION]
14
14
  end
15
15
  end
16
16
 
17
- # override #handle_dependency to apply the new option if set
17
+ # override Association#handle_dependency to apply the new option if it is set
18
18
  module DependencyHandling
19
19
  def handle_dependency
20
- super unless DeleteRecursively.enabled_for?(self)
21
- # Pass true because #handle_dependency is triggered by destroy
22
- # callbacks, and thus the owner is already being deleted.
23
- DeleteRecursively.delete_recursively(owner.class, owner.id, true)
20
+ return super unless DeleteRecursively.enabled_for?(self)
21
+ if reflection.belongs_to?
22
+ # can't use ::dependent_ids, owner is already destroyed at this point
23
+ ids = load_target ? target.id : []
24
+ else
25
+ ids = DeleteRecursively.dependent_ids(owner.class, owner.id, reflection)
26
+ end
27
+ DeleteRecursively.delete_recursively(reflection, ids)
24
28
  end
25
29
  end
26
30
 
27
- def self.enabled_for?(association)
28
- association.options[:dependent] == NEW_DEPENDENT_OPTION
31
+ def self.delete_recursively(reflection, record_ids)
32
+ record_class = reflection.klass
33
+ record_class.reflect_on_all_associations.each do |sub_reflection|
34
+ next unless recurse_on?(sub_reflection)
35
+ dependent_ids = dependent_ids(record_class, record_ids, sub_reflection)
36
+ delete_recursively(sub_reflection, dependent_ids)
37
+ end
38
+ record_class.delete(record_ids) if enabled_for?(reflection)
39
+ record_class.destroy(record_ids) if destructive?(reflection)
29
40
  end
30
41
 
31
- def self.delete_recursively(record_class, record_ids, only_dependents = false)
32
- # delete all passed records
33
- record_class.delete(record_ids) unless only_dependents
42
+ def self.recurse_on?(reflection)
43
+ enabled_for?(reflection) || destructive?(reflection)
44
+ end
34
45
 
35
- # delete all records with a dependency on the passed records
36
- record_class.reflect_on_all_associations.each do |assoc|
37
- next unless enabled_for?(assoc)
38
- dependent_class = assoc.klass
39
- dependent_ids = dependent_ids(record_class, record_ids, assoc)
40
- delete_recursively(dependent_class, dependent_ids)
41
- end
46
+ def self.enabled_for?(reflection)
47
+ reflection.options[:dependent] == NEW_DEPENDENT_OPTION
48
+ end
49
+
50
+ def self.destructive?(reflection)
51
+ [:destroy, :destroy_all].include?(reflection.options[:dependent])
42
52
  end
43
53
 
44
- def self.dependent_ids(record_class, record_ids, assoc)
45
- if assoc.belongs_to?
46
- records_arel = record_class.where(record_class.primary_key => record_ids)
47
- records_arel.pluck(assoc.association_foreign_key).compact
54
+ def self.dependent_ids(owner_class, owner_ids, reflection)
55
+ if reflection.belongs_to?
56
+ owners_arel = owner_class.where(owner_class.primary_key => owner_ids)
57
+ owners_arel.pluck(reflection.association_foreign_key).compact
48
58
  else
49
- custom_foreign_key = assoc.options[:foreign_key]
50
- foreign_key = custom_foreign_key || record_class.to_s.foreign_key
51
- assoc.klass.where(foreign_key => record_ids).ids
59
+ custom_foreign_key = reflection.options[:foreign_key]
60
+ foreign_key = custom_foreign_key || owner_class.to_s.foreign_key
61
+ reflection.klass.where(foreign_key => owner_ids).ids
52
62
  end
53
63
  end
54
64
 
55
65
  def self.all(record_class)
56
66
  record_class.delete_all
57
- record_class.reflect_on_all_associations.each do |assoc|
58
- all(assoc.klass) if enabled_for?(assoc)
67
+ record_class.reflect_on_all_associations.each do |reflection|
68
+ all(reflection.klass) if recurse_on?(reflection)
59
69
  end
60
70
  end
61
71
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delete_recursively
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janosch Müller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-30 00:00:00.000000000 Z
11
+ date: 2015-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -136,8 +136,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  version: '0'
137
137
  requirements: []
138
138
  rubyforge_project:
139
- rubygems_version: 2.2.2
139
+ rubygems_version: 2.4.8
140
140
  signing_key:
141
141
  specification_version: 4
142
142
  summary: Delete ActiveRecords efficiently
143
143
  test_files: []
144
+ has_rdoc: