24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
# File 'lib/never_wastes.rb', line 24
def self.included(base)
base.class_eval do
class_attribute :never_wastes_boolean_column_name, :never_wastes_datetime_column_name, :never_wastes_id_column_name
self.never_wastes_boolean_column_name = :deleted
self.never_wastes_datetime_column_name = :deleted_at
self.never_wastes_id_column_name = :waste_id
alias_method :demolish, :destroy
alias_method :demolish!, :destroy! if instance_methods.include?(:destroy!)
def destroy_softly
@destroying_softly = true
ret = with_transaction_returning_status do
run_callbacks :destroy do
stamps = soft_destroy_stamps
self.class.where(self.class.primary_key.to_sym => id).update_all(stamps)
stamps.each {|key, value| send("#{key}=", value)}
@destroyed = true
freeze
end
end
@destroying_softly = nil
ret
end
alias_method :destroy, :destroy_softly
default_scope {where(:deleted => false)}
class << self
def with_deleted
unscoped
end
alias_method :demolish_all, :delete_all
def delete_all_softly
updates = sanitize_sql_for_assignment(never_wastes_boolean_column_name => true)
if column_names.include?(never_wastes_datetime_column_name.to_s)
updates << ","
updates << sanitize_sql_for_assignment(never_wastes_datetime_column_name => current_time)
end
if column_names.include?(never_wastes_id_column_name.to_s)
updates << ","
updates << "#{never_wastes_id_column_name.to_s} = #{primary_key}"
end
update_all(updates)
end
alias_method :delete_all, :delete_all_softly
end
private
def soft_destroy_stamps
stamps = {self.class.never_wastes_boolean_column_name => true}
stamps[self.class.never_wastes_datetime_column_name] = self.class.current_time if self.class.column_names.include?(self.class.never_wastes_datetime_column_name.to_s)
stamps[self.class.never_wastes_id_column_name] = id if self.class.column_names.include?(self.class.never_wastes_id_column_name.to_s)
stamps
end
def destroying_softly?
@destroying_softly
end
def self.current_time
default_timezone == :utc ? Time.now.utc : Time.now
end
end
end
|