on_destroy 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -31,23 +31,22 @@ Something similar to light version of rails3_acts_as_paranoid could be produced
31
31
  default_scope where("deleted_at IS NOT NULL")
32
32
  on_destroy :do_not_delete, set: :deleted_at, to: lambda {Time.now}
33
33
 
34
- Do on_destroy for all models with:
34
+ If you have the same deleted column and process for all models, instead of using on_destroy in every model, use configure:
35
35
 
36
36
  # Do it for everything
37
37
  OnDestroy.configure do
38
38
  self.do_not_delete = true
39
- self.set = [:deleted]
40
- self.to = true
39
+ self.on_destroy_options = [:do_not_delete, {set: :deleted_at, to: lambda {Time.now}]
41
40
  end
42
41
 
43
42
  If you want control over how it intuits how something is deleted (which is to look at the deleted date) use `:is_deleted_if` which can be a value, nil, or a Proc that takes the attribute value:
44
43
 
45
44
  on_destroy :do_not_delete, set: :some_column, to: lambda {Time.now}, is_deleted_if: {|c|Time.now > c} # provide time-travel resistent behavior of destroyed?/deleted?
46
- on_destroy :do_not_delete, set: :some_column, to: 1 is_deleted_if: 1 # this is not necessary, as it will already check for 1 since you specified it in the :to
45
+ on_destroy :do_not_delete, set: :some_column, to: 1, is_deleted_if: 1 # this is not necessary, as it will already check for 1 since you specified it in the :to
47
46
 
48
47
  If you use a proc to set the value and a value of nil indicates that it should be deleted (which is kind of wierd), you'll need to set:
49
48
 
50
- on_destroy :do_not_delete, set: :some_column, to: lambda {nil} is_deleted_if: nil
49
+ on_destroy :do_not_delete, set: :some_column, to: lambda {nil}, is_deleted_if: nil
51
50
 
52
51
  To call a normal-ish `destroy` method, use the `really_destroy` method. I think this is better than using `destroy!` because all of the other bang methods on ActiveRecord.base tend to just throw errors, not behave that differently, despite the `destroy!` method being a naming convention from acts_as_paranoid.
53
52
 
@@ -1,9 +1,7 @@
1
1
  module OnDestroy
2
2
  OPTIONS = [
3
3
  :do_not_delete,
4
- :set,
5
- :to,
6
- :is_deleted_if
4
+ :on_destroy_options,
7
5
  ]
8
6
 
9
7
  class << self
@@ -12,9 +10,8 @@ module OnDestroy
12
10
  end
13
11
  end
14
12
 
15
- # Do it for everything
13
+ # defaults
16
14
  #OnDestroy.configure do
17
- # self.do_not_delete = true
18
- # self.set = [:deleted]
19
- # self.to = true
15
+ # self.do_not_delete = false
16
+ # self.on_destroy_options = nil
20
17
  #end
@@ -3,8 +3,6 @@ module OnDestroy
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- class_attribute :defined_is_deleted_if
7
- # use values from config
8
6
  OnDestroy::OPTIONS.each do |key|
9
7
  class_attribute key, instance_writer: true
10
8
  self.send("#{key}=".to_sym, OnDestroy.send(key))
@@ -18,20 +16,8 @@ module OnDestroy
18
16
  # and to default self.is_deleted_if to a proc that
19
17
  def on_destroy(*args)
20
18
  options = args.extract_options!
21
- self.do_not_delete = true if args.include?(:do_not_delete)
22
- self.set = options[:set] if options[:set]
23
- self.to = options[:to] if options[:to]
24
- if options[:is_deleted_if]
25
- # set defined_is_deleted_if to allow explicit set to nil
26
- self.defined_is_deleted_if = true
27
- self.is_deleted_if = options[:is_deleted_if]
28
- elsif (options[:to].is_a?(Proc))
29
- # if :to is a Proc, assume that a nil value means it is not deleted and if not-nil is deleted.
30
- # that is just a guess, based on the mark with deleted_at date example.
31
- self.is_deleted_if = Proc.new {|v| v != nil}
32
- else
33
- self.is_deleted_if = Proc.new {|v| v == options[:to]}
34
- end
19
+ self.do_not_delete = args.include?(:do_not_delete)
20
+ self.on_destroy_options = options
35
21
  end
36
22
  end
37
23
 
@@ -39,11 +25,14 @@ module OnDestroy
39
25
 
40
26
  # if self.set then will use update_attributes! to set the self.set attribute to self.to or self.to.call if it is a Proc.
41
27
  def do_on_destroy
42
- if self.set
43
- to_value = self.to.is_a?(Proc) ? self.to.call : self.to
44
- update_attributes! self.set => to_value
28
+ if self.on_destroy_options
29
+ o_set = self.on_destroy_options[:set]
30
+ o_to = self.on_destroy_options[:to]
31
+ if o_set
32
+ update_attributes! o_set => (o_to.is_a?(Proc) ? o_to.call : o_to)
33
+ end
34
+ yield
45
35
  end
46
- yield
47
36
  end
48
37
 
49
38
  # if self.do_not_delete? runs no/empty callback on :destroy, otherwise calls super.
@@ -62,17 +51,21 @@ module OnDestroy
62
51
  run_callbacks(:destroy) {delete}
63
52
  end
64
53
 
65
- # if self.is_deleted_if is a Proc compares self.is_deleted_if.call to send(self.to).
66
- # if self.is_deleted_if is not nil compares self.is_deleted_if.call to send(self.to).
67
- # If self.is_deleted_if not a Proc, calls super.
68
54
  def destroyed?
69
- if self.is_deleted_if.is_a?(Proc)
70
- self.is_deleted_if.call(self.to)
71
- elsif self.is_deleted_if.nil? && !(self.defined_is_deleted_if == true)
72
- # will default to super only if self.is_deleted_if not defined by user
73
- super
55
+ if self.on_destroy_options
56
+ is_deleted_if = self.on_destroy_options[:is_deleted_if]
57
+ o_set = self.on_destroy_options[:set]
58
+ o_to = self.on_destroy_options[:to]
59
+ if is_deleted_if.is_a?(Proc)
60
+ send(o_set) == is_deleted_if.call
61
+ elsif o_to.is_a?(Proc)
62
+ # assume that a :to defined as a Proc is going to evaluate to a non-nil to indicate the model is null
63
+ send(o_set) != nil
64
+ else
65
+ send(o_set) == o_to
66
+ end
74
67
  else
75
- self.is_deleted_if == self.to
68
+ super
76
69
  end
77
70
  end
78
71
 
@@ -1,3 +1,3 @@
1
1
  module OnDestroy
2
- VERSION = '0.0.3'
2
+ VERSION = '0.1.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: on_destroy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: