soft_deletion 0.5.1 → 0.5.2

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