lib/paper_trail-audit.rb
def calculate_audit_for(param)
      #Gets all flattened attribute lists
      #objects are a hash of
      #{attributes: object attributes, whodunnit: paper_trail whodunnit which caused the object to be in this state}
      objects = [{attributes: self.attributes, whodunnit: self.paper_trail.originator},
        self.versions.map {|e| {attributes: YAML.load(e.object), whodunnit: e.paper_trail_originator} if e.object}.compact].flatten
      #rejecting objects with no update time, orders by the updated at times in ascending order
      objects = objects.select {|e| e[:attributes]["updated_at"]}.sort_by {|e| e[:attributes]["updated_at"]}
      result = []
      #Add the initial state if the first element has a value
      if(objects.count > 0 && !objects.first[:attributes][param.to_s].nil?)
        result <<  PaperTrailAudit::Change.new({old_value: nil,
            new_value: objects.first[:attributes][param.to_s],
            time: objects.first[:attributes]["updated_at"],
            whodunnit: objects.first[:whodunnit]
            })
      end
      objects.each_cons(2) do |a,b|
        if a[:attributes][param.to_s] != b[:attributes][param.to_s]
          result << PaperTrailAudit::Change.new({old_value: a[:attributes][param.to_s],
            new_value: b[:attributes][param.to_s],
            time: b[:attributes]["updated_at"],
            whodunnit: b[:whodunnit]
          })
        end
      end
      result
    end
def calculate_audit_for(param)
      #Gets all flattened attribute lists
      #objects are a hash of
      #{attributes: object attributes, whodunnit: paper_trail whodunnit which caused the object to be in this state}
      objects = [{attributes: self.attributes, whodunnit: self.paper_trail.originator},
        self.versions.map {|e| {attributes: YAML.load(e.object), whodunnit: e.paper_trail_originator} if e.object}.compact].flatten
      #rejecting objects with no update time, orders by the updated at times in ascending order
      objects = objects.select {|e| e[:attributes]["updated_at"]}.sort_by {|e| e[:attributes]["updated_at"]}
      result = []
      #Add the initial state if the first element has a value
      if(objects.count > 0 && !objects.first[:attributes][param.to_s].nil?)
        result <<  PaperTrailAudit::Change.new({old_value: nil,
            new_value: objects.first[:attributes][param.to_s],
            time: objects.first[:attributes]["updated_at"],
            whodunnit: objects.first[:whodunnit]
            })
      end
      objects.each_cons(2) do |a,b|
        if a[:attributes][param.to_s] != b[:attributes][param.to_s]
          result << PaperTrailAudit::Change.new({old_value: a[:attributes][param.to_s],
            new_value: b[:attributes][param.to_s],
            time: b[:attributes]["updated_at"],
            whodunnit: b[:whodunnit]
          })
        end
      end
      result
    end
Returns the audit list for the specified column

 @param [symbol] param: symbol to query
 @return [array of Change objects]