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



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

def set_default_status
  return unless 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
# File 'app/models/status_history.rb', line 38

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

#status=(new_status) ⇒ Object



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

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

#status_changed_at=(whatever) ⇒ Object



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

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