delete_recursively 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
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: