123456789_123456789_123456789_123456789_123456789_

Class: ActiveModel::AttributeMutationTracker

Do not use. This class is for internal use only.
Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Inherits: Object
Defined in: activemodel/lib/active_model/attribute_mutation_tracker.rb

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(attributes) ⇒ AttributeMutationTracker

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 10

def initialize(attributes)
  @attributes = attributes
end

Instance Attribute Details

#any_changes?Boolean (readonly)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 40

def any_changes?
  attr_names.any? { |attr| changed?(attr) }
end

#attributes (readonly, private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 68

attr_reader :attributes

Instance Method Details

#attr_names (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 74

def attr_names
  attributes.keys
end

#attribute_changed?(attr_name) ⇒ Boolean (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 78

def attribute_changed?(attr_name)
  forced_changes.include?(attr_name) || !!attributes[attr_name].changed?
end

#change_to_attribute(attr_name)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 34

def change_to_attribute(attr_name)
  if changed?(attr_name)
    [original_value(attr_name), fetch_value(attr_name)]
  end
end

#changed?(attr_name, from: OPTION_NOT_GIVEN, to: OPTION_NOT_GIVEN) ⇒ Boolean

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 44

def changed?(attr_name, from: OPTION_NOT_GIVEN, to: OPTION_NOT_GIVEN)
  attribute_changed?(attr_name) &&
    (OPTION_NOT_GIVEN == from || original_value(attr_name) == type_cast(attr_name, from)) &&
    (OPTION_NOT_GIVEN == to || fetch_value(attr_name) == type_cast(attr_name, to))
end

#changed_attribute_names

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 14

def changed_attribute_names
  attr_names.select { |attr_name| changed?(attr_name) }
end

#changed_in_place?(attr_name) ⇒ Boolean

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 50

def changed_in_place?(attr_name)
  attributes[attr_name].changed_in_place?
end

#changed_values

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 18

def changed_values
  attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result|
    if changed?(attr_name)
      result[attr_name] = original_value(attr_name)
    end
  end
end

#changes

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 26

def changes
  attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result|
    if change = change_to_attribute(attr_name)
      result.merge!(attr_name => change)
    end
  end
end

#fetch_value(attr_name) (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 82

def fetch_value(attr_name)
  attributes.fetch_value(attr_name)
end

#force_change(attr_name)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 63

def force_change(attr_name)
  forced_changes[attr_name] = fetch_value(attr_name)
end

#forced_changes (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 70

def forced_changes
  @forced_changes ||= {}
end

#forget_change(attr_name)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 54

def forget_change(attr_name)
  attributes[attr_name] = attributes[attr_name].forgetting_assignment
  forced_changes.delete(attr_name)
end

#original_value(attr_name)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 59

def original_value(attr_name)
  attributes[attr_name].original_value
end

#type_cast(attr_name, value) (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_mutation_tracker.rb', line 86

def type_cast(attr_name, value)
  attributes[attr_name].type_cast(value)
end