Module: StatusHistory

Overview

Author

Chris Hauboldt ([email protected])

Copyright

2009 Lone Star Internet Inc.

Used to keep track of an objects status so that we can add more behaviour such as actual history of statuses if we so choose.

classes using this should define ‘default_status’, ‘valid_statuses’

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

default list of statuses … in most cases should be overridden



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'app/models/status_history.rb', line 22

def self.included(base)
  Rails.logger.warn "Including statuses for #{base.class.name} #{base.name rescue "Blarg"}"
  base.class_eval %Q|
# sets the initial status of an object if not set
class_attribute :valid_statuses, :default_status
def self.override_statuses(valid,default)
  Rails.logger.debug "Overriding Statuses for " + self.class.name + " - " + (self.name rescue "Blarg") + ", " +
    valid.inspect + ", " + default
  self.valid_statuses = valid
  self.default_status = default
end
override_statuses(['active', 'inactive', 'deleted'],'active')
|
end

Instance Method Details

#change_status(new_status, save_record = true) ⇒ Object

defines what happens when you change a status … currently updates status and records a timestamp



13
14
15
16
17
18
19
# File 'app/models/status_history.rb', line 13

def change_status(new_status,save_record=true)
  raise "Invalid Status (#{new_status}) valid statuses: #{valid_statuses.join(',')}" unless self.class.valid_statuses.include?(new_status.to_s)
  return if new_status.eql?(status)
  self[:status] = new_status.to_s
  self[:status_changed_at] = Time.now.utc
  save if save_record
end

#set_default_statusObject



53
54
55
56
57
58
59
# File 'app/models/status_history.rb', line 53

def set_default_status
  return unless self[:status].blank?
  self[:status_changed_at] = Time.now.utc
  self[:status] = default_status
  Rails.logger.debug "Setting Default Status to #{default_status} #{self.name rescue "Not a class?"} #{self.class.name}"
  self[:status]
end

#statusObject



38
39
40
41
42
# File 'app/models/status_history.rb', line 38

def status
  return self[:status].to_s unless self[:status].blank?
  set_default_status
  self[:status]
end

#status=(new_status) ⇒ Object



44
45
46
47
# File 'app/models/status_history.rb', line 44

def status=(new_status)
  return if status.eql?(new_status.to_s)
  change_status(new_status)
end

#status_changed_at=(whatever) ⇒ Object



49
50
51
# File 'app/models/status_history.rb', line 49

def status_changed_at=(whatever)
  raise "Invalid status change - use change_status(status) valid statuses: #{valid_statuses.join(',')}"
end