Class: PaperTrailDiff::PreparedVersionStateLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/paper_trail_diff/prepared_record_index.rb,
sig/generated/paper_trail_diff/prepared_record_index.rbs

Overview

Extracts a version's scalar state without constructing a disposable AR object.

Instance Method Summary collapse

Constructor Details

#initializePreparedVersionStateLoader

: () -> void



47
48
49
50
# File 'lib/paper_trail_diff/prepared_record_index.rb', line 47

def initialize
  @serializers = {} #: Hash[untyped, untyped]
  @attribute_names = {} #: Hash[untyped, Array[String]]
end

Instance Method Details

#call(version) ⇒ PreparedRecordState?

: (untyped) -> PreparedRecordState?

Parameters:

  • (Object)

Returns:



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/paper_trail_diff/prepared_record_index.rb', line 53

def call(version)
  return unless version.object

  attributes = version.object_deserialized
  return unless attributes.is_a?(Hash)

  attributes = stringify_keys(attributes)
  model_class = reification_class(version, attributes)
  return unless direct_attributes?(model_class, attributes)

  object_attribute_serializer(model_class).deserialize(attributes)
  PreparedRecordState.from_attributes(model_class, attributes)
rescue StandardError
  nil
end

#direct_attributes?(model_class, attributes) ⇒ Boolean

: (untyped, Hash[String, untyped]) -> bool

Parameters:

  • (Object)
  • (Hash[String, untyped])

Returns:

  • (Boolean)


89
90
91
92
93
94
95
# File 'lib/paper_trail_diff/prepared_record_index.rb', line 89

def direct_attributes?(model_class, attributes)
  encrypted = model_class.encrypted_attributes if model_class.respond_to?(:encrypted_attributes)
  return false if encrypted&.any?

  names = @attribute_names[model_class] ||= model_class.attribute_names
  (attributes.keys - names).empty?
end

#object_attribute_serializer(model_class) ⇒ Object

: (untyped) -> untyped

Parameters:

  • (Object)

Returns:

  • (Object)


98
99
100
101
102
103
# File 'lib/paper_trail_diff/prepared_record_index.rb', line 98

def object_attribute_serializer(model_class)
  paper_trail = Object.const_get(:PaperTrail)
  serializers = paper_trail.const_get(:AttributeSerializers)
  serializer_class = serializers.const_get(:ObjectAttribute)
  @serializers[model_class] ||= serializer_class.new(model_class)
end

#reification_class(version, attributes) ⇒ Object

: (untyped, Hash[String, untyped]) -> untyped

Parameters:

  • (Object)
  • (Hash[String, untyped])

Returns:

  • (Object)


80
81
82
83
84
85
86
# File 'lib/paper_trail_diff/prepared_record_index.rb', line 80

def reification_class(version, attributes)
  model_class = Endpoint.model_class(version)
  inheritance_value = attributes[model_class.inheritance_column]
  return model_class if inheritance_value.nil? || inheritance_value.to_s.empty?

  model_class.sti_class_for(inheritance_value)
end

#stringify_keys(attributes) ⇒ Hash[String, untyped]

: (Hash[untyped, untyped]) -> Hash[String, untyped]

Parameters:

  • (Hash[untyped, untyped])

Returns:

  • (Hash[String, untyped])


75
76
77
# File 'lib/paper_trail_diff/prepared_record_index.rb', line 75

def stringify_keys(attributes)
  attributes.to_h { |name, value| [name.to_s, value] }
end