soft_deletion 0.5.1 → 0.5.2

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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- soft_deletion (0.5.1)
4
+ soft_deletion (0.5.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/Readme.md CHANGED
@@ -38,6 +38,12 @@ Usage
38
38
  # soft delete many
39
39
  User.soft_delete_all!(1,2,3,4)
40
40
 
41
+ TODO
42
+ ====
43
+ - nullify should use update_all on has_many on soft_delete (performance)
44
+ - has_many :through should delete join associations on soft_delete
45
+ - cascading soft_deletes should use the same timestamp for easy reverts
46
+
41
47
  Authors
42
48
  =======
43
49
 
@@ -21,9 +21,9 @@ module SoftDeletion
21
21
 
22
22
  module ClassMethods
23
23
  def soft_delete_dependents
24
- self.reflect_on_all_associations.
24
+ reflect_on_all_associations.
25
25
  select { |a| [:destroy, :delete_all, :nullify].include?(a.options[:dependent]) }.
26
- map(&:name)
26
+ select { |a| a.klass.method_defined?(:soft_delete!) }.map(&:name)
27
27
  end
28
28
 
29
29
  def with_deleted
@@ -8,18 +8,17 @@ module SoftDeletion
8
8
  end
9
9
 
10
10
  def soft_delete!
11
- return unless can_soft_delete?
12
-
13
- if nullify?
11
+ case association.options[:dependent]
12
+ when :nullify
14
13
  nullify_dependencies
14
+ when :delete_all
15
+ dependency.update_all(:deleted_at => Time.now)
15
16
  else
16
17
  dependencies.each(&:soft_delete!)
17
18
  end
18
19
  end
19
20
 
20
21
  def soft_undelete!(limit)
21
- return unless can_soft_delete?
22
-
23
22
  klass.with_deleted do
24
23
  dependencies.reject { |m| m.deleted_at < limit }.each(&:soft_undelete!)
25
24
  end
@@ -27,10 +26,6 @@ module SoftDeletion
27
26
 
28
27
  protected
29
28
 
30
- def nullify?
31
- association.options[:dependent] == :nullify
32
- end
33
-
34
29
  def nullify_dependencies
35
30
  dependencies.each do |dependency|
36
31
  foreign_key = if association.respond_to?(:foreign_key) # rails 3.1+
@@ -43,10 +38,6 @@ module SoftDeletion
43
38
  end
44
39
  end
45
40
 
46
- def can_soft_delete?
47
- klass.method_defined? :soft_delete!
48
- end
49
-
50
41
  def klass
51
42
  association.klass
52
43
  end
@@ -55,8 +46,12 @@ module SoftDeletion
55
46
  record.class.reflect_on_association(association_name.to_sym)
56
47
  end
57
48
 
49
+ def dependency
50
+ record.send(association_name)
51
+ end
52
+
58
53
  def dependencies
59
- Array.wrap(record.send(association_name))
54
+ Array.wrap(dependency)
60
55
  end
61
56
  end
62
57
  end
@@ -1,3 +1,3 @@
1
1
  module SoftDeletion
2
- VERSION = '0.5.1'
2
+ VERSION = '0.5.2'
3
3
  end
@@ -330,6 +330,29 @@ describe SoftDeletion do
330
330
  end
331
331
  end
332
332
 
333
+ context "a soft-deleted has-many category that delete_all forum references on delete" do
334
+ it "use update_all to delete references" do
335
+ category = DDACategory.create!
336
+ forum = category.forums.create!
337
+ category.soft_delete!
338
+
339
+ forum.should_not be_deleted # just did an update_all
340
+ Forum.find(forum.id).should be_deleted
341
+ end
342
+ end
343
+
344
+ context "a soft-deleted has-many category that defaults dependent forum references on delete" do
345
+ it "does nothing to those references" do
346
+ category = XDACategory.create!
347
+ forum = category.forums.create!
348
+ category.soft_delete!
349
+
350
+ forum.reload
351
+ forum.should_not be_deleted
352
+ forum.category_id.should_not be_nil
353
+ end
354
+ end
355
+
333
356
  context "a soft-deleted has-many category that nullifies forum references on delete without foreign_key" do
334
357
  it "should nullify those references" do
335
358
  organization = Organization.create!
data/spec/spec_helper.rb CHANGED
@@ -121,6 +121,24 @@ class NDACategory < ActiveRecord::Base
121
121
  has_many :forums, :dependent => :nullify, :foreign_key => :category_id
122
122
  end
123
123
 
124
+ # Delete dependent association
125
+ class DDACategory < ActiveRecord::Base
126
+ silent_set_table_name 'categories'
127
+
128
+ has_soft_deletion
129
+
130
+ has_many :forums, :dependent => :delete_all, :foreign_key => :category_id
131
+ end
132
+
133
+ # default dependent association
134
+ class XDACategory < ActiveRecord::Base
135
+ silent_set_table_name 'categories'
136
+
137
+ has_soft_deletion
138
+
139
+ has_many :forums, :foreign_key => :category_id
140
+ end
141
+
124
142
  # Has ome association
125
143
  class HOACategory < ActiveRecord::Base
126
144
  silent_set_table_name 'categories'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soft_deletion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -54,7 +54,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
54
  version: '0'
55
55
  segments:
56
56
  - 0
57
- hash: -2369399626209139476
57
+ hash: -1879420123943437209
58
58
  required_rubygems_version: !ruby/object:Gem::Requirement
59
59
  none: false
60
60
  requirements:
@@ -63,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  version: '0'
64
64
  segments:
65
65
  - 0
66
- hash: -2369399626209139476
66
+ hash: -1879420123943437209
67
67
  requirements: []
68
68
  rubyforge_project:
69
69
  rubygems_version: 1.8.25