Module: Blamestamp::Blameable

Extended by:
ActiveSupport::Concern
Defined in:
lib/blamestamp/active_record.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#blame_cascade(time, usr_id) ⇒ Object

called by other models, when they’re updated



90
91
92
93
94
95
# File 'lib/blamestamp/active_record.rb', line 90

def blame_cascade(time, usr_id)
  at_col = self.blameable_config[:upd_at]
  by_col = self.blameable_config[:upd_by]
  self[at_col] = time
  self[by_col] = usr_id
end

#blame_createObject

create callback

Raises:



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/blamestamp/active_record.rb', line 56

def blame_create
  at_col = self.blameable_config[:cre_at]
  by_col = self.blameable_config[:cre_by]
  name   = self.blameable_config[:cre_user]

  # only set blanks
  self[at_col] = Time.now if self[at_col].blank?
  self[by_col] = Blamestamp::get_blame_user if self[by_col].blank? && !self.send(name)

  # required option
  raise NoBlameUserError if self.blameable_config[:required] && !self[by_col]

  # cascade
  self.cascade_blame!(self[at_col], self[by_col])
end

#blame_destroyObject

destory callback



85
86
87
# File 'lib/blamestamp/active_record.rb', line 85

def blame_destroy
  self.cascade_blame!(Time.now, Blamestamp::get_blame_user)
end

#blame_updateObject

update callback



73
74
75
76
77
78
79
80
81
82
# File 'lib/blamestamp/active_record.rb', line 73

def blame_update
  at_col = self.blameable_config[:upd_at]
  by_col = self.blameable_config[:upd_by]
  name   = self.blameable_config[:upd_user]

  # respect manual user updates
  self[at_col] = Time.now unless self.changed.include?(at_col)
  self[by_col] = Blamestamp::get_blame_user unless self.changed.include?(by_col)
  self.cascade_blame!(self[at_col], self[by_col])
end

#cascade_blame!(time, usr_id) ⇒ Object

cascade the blame up



46
47
48
49
50
51
52
53
# File 'lib/blamestamp/active_record.rb', line 46

def cascade_blame!(time, usr_id)
  self.blameable_config[:cascade].each do |assoc|
    if self.send(assoc)
      self.send(assoc).blame_cascade(time, usr_id)
      self.send(assoc).save :validate => false
    end
  end
end

#has_non_blame_changes?Boolean

check if non-blame columns have changed



98
99
100
101
102
103
104
105
106
# File 'lib/blamestamp/active_record.rb', line 98

def has_non_blame_changes?
  cols = [
    self.blameable_config[:cre_at],
    self.blameable_config[:cre_by],
    self.blameable_config[:upd_at],
    self.blameable_config[:upd_by],
  ]
  (self.changed - cols).empty? ? false : true
end