Class: PaperTrailDiff::PreparedVersionStateLoader
- Inherits:
-
Object
- Object
- PaperTrailDiff::PreparedVersionStateLoader
- 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
-
#call(version) ⇒ PreparedRecordState?
: (untyped) -> PreparedRecordState?.
-
#direct_attributes?(model_class, attributes) ⇒ Boolean
: (untyped, Hash[String, untyped]) -> bool.
-
#initialize ⇒ PreparedVersionStateLoader
constructor
: () -> void.
-
#object_attribute_serializer(model_class) ⇒ Object
: (untyped) -> untyped.
-
#reification_class(version, attributes) ⇒ Object
: (untyped, Hash[String, untyped]) -> untyped.
-
#stringify_keys(attributes) ⇒ Hash[String, untyped]
: (Hash[untyped, untyped]) -> Hash[String, untyped].
Constructor Details
#initialize ⇒ PreparedVersionStateLoader
: () -> 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?
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
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
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
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]
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 |