Sha256: c7efa0f25c241611eebe475e3e17ce2fc2991fb34284b68d45271ac9781374d1

Contents?: true

Size: 1.59 KB

Versions: 2

Compression:

Stored size: 1.59 KB

Contents

class DirtyHistoryRecord < ActiveRecord::Base   
  belongs_to :creator,  :polymorphic => true
  belongs_to :object,   :polymorphic => true

  validates_presence_of :old_value,   :unless => proc { |record| record.object.initialize_dirty_history }
  validates_presence_of :object_type, :object_id, :column_name, :column_type, :new_value

  scope :created_by,      lambda { |creator| where(:creator_id => creator.id, :creator_type => creator.class.name) }
  scope :for_object_type, lambda { |object_type| where(:object_type => object_type.to_s.classify) }
  scope :for_attribute,   lambda { |attribute| where(:column_name => attribute.to_s) }

  acts_as_paranoid
      
  [:new_value, :old_value].each do |attribute|
    define_method "#{attribute}" do 
      val_to_col_type(attribute)
    end
    define_method "#{attribute}=" do |val|
      self[attribute] = val.nil? ? nil : val.to_s
      instance_variable_set "@#{attribute}", val
    end
  end       
       
  def action_timestamp                           
    # use revised_created_at field to update the timestamp for the dirty history action while retaining data integrity
    self[:revised_created_at] || self[:created_at]
  end            
  
  private
  
  def val_to_col_type attribute
    val_as_string = self[attribute]
    return nil if val_as_string.nil?
    case self[:column_type].to_sym
    when :integer, :boolean
      val_as_string.to_i
    when :decimal, :float
      val_as_string.to_f
    when :datetime
      Time.parse val_as_string
    when :date
      Date.parse val_as_string
    else # :string, :text
      val_as_string
    end
  end
  
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dirty_history-0.4.3 lib/dirty_history/dirty_history_record.rb
dirty_history-0.4.2 lib/dirty_history/dirty_history_record.rb