Module: ASModel::ChangeTracking

Defined in:
backend/app/model/ASModel_change_tracking.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#previous_changesObject (readonly)

A hash of previous changes before the object was saved, in the same format as #column_changes. Note that this is not necessarily the same as the columns that were used in the update statement.



14
15
16
# File 'backend/app/model/ASModel_change_tracking.rb', line 14

def previous_changes
  @previous_changes
end

Instance Method Details

#column_change(column) ⇒ Object

An array with the initial value and the current value of the column, if the column has been changed. If the column has not been changed, returns nil.

column_change(:name) # => [‘Initial’, ‘Current’]



21
22
23
# File 'backend/app/model/ASModel_change_tracking.rb', line 21

def column_change(column)
  [initial_value(column), get_column_value(column)] if column_changed?(column)
end

#column_changed?(column) ⇒ Boolean

Either true or false depending on whether the column has changed. Note that this is not exactly the same as checking if the column is in changed_columns, if the column was not set initially.

column_changed?(:name) # => true

Returns:

  • (Boolean)


43
44
45
# File 'backend/app/model/ASModel_change_tracking.rb', line 43

def column_changed?(column)
  initial_values.has_key?(column)
end

#column_changesObject

A hash with column symbol keys and pairs of initial and current values for all changed columns.

column_changes # => => [‘Initial’, ‘Current’]



29
30
31
32
33
34
35
# File 'backend/app/model/ASModel_change_tracking.rb', line 29

def column_changes
  h = {}
  initial_values.each do |column, value|
    h[column] = [value, get_column_value(column)]
  end
  h
end

#freezeObject

Freeze internal data structures



48
49
50
51
52
53
# File 'backend/app/model/ASModel_change_tracking.rb', line 48

def freeze
  initial_values.freeze
  missing_initial_values.freeze
  @previous_changes.freeze if @previous_changes
  super
end

#initial_value(column) ⇒ Object

The initial value of the given column. If the column value has not changed, this will be the same as the current value of the column.

initial_value(:name) # => ‘Initial’



60
61
62
# File 'backend/app/model/ASModel_change_tracking.rb', line 60

def initial_value(column)
  initial_values.fetch(column) {get_column_value(column)}
end

#initial_valuesObject

A hash with column symbol keys and initial values.

initial_values # => ‘Initial’



67
68
69
# File 'backend/app/model/ASModel_change_tracking.rb', line 67

def initial_values
  @initial_values ||= {}
end

#reset_column(column) ⇒ Object

Reset the column to its initial value. If the column was not set initial, removes it from the values.

reset_column(:name) name # => ‘Initial’



76
77
78
79
80
81
82
83
# File 'backend/app/model/ASModel_change_tracking.rb', line 76

def reset_column(column)
  if initial_values.has_key?(column)
    set_column_value(:"#{column}=", initial_values[column])
  end
  if missing_initial_values.include?(column)
    values.delete(column)
  end
end

#will_change_column(column) ⇒ Object

Manually specify that a column will change. This should only be used if you plan to modify a column value in place, which is not recommended.

will_change_column(:name) name.gsub(/i/i, ‘o’) column_change(:name) # => [‘Initial’, ‘onotoal’]



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'backend/app/model/ASModel_change_tracking.rb', line 91

def will_change_column(column)
  changed_columns << column unless changed_columns.include?(column)
  check_missing_initial_value(column)

  value = if initial_values.has_key?(column)
            initial_values[column]
          else
            get_column_value(column)
          end

  initial_values[column] = if value && value != true && value.respond_to?(:clone)
                             begin
                               value.clone
                             rescue TypeError
                               value
                             end
                           else
                             value
                           end
end