Class: PaperTrailDiff::ActivityEventRecordResolver
- Inherits:
-
Object
- Object
- PaperTrailDiff::ActivityEventRecordResolver
- Defined in:
- lib/paper_trail_diff/activity_event_record_resolver.rb,
sig/generated/paper_trail_diff/activity_event_record_resolver.rbs
Overview
Reconstructs an event's post-change record or immutable scalar delta.
Constant Summary collapse
- RECORD_AFTER_HANDLERS =
{ 'create' => :created_record_after, 'update' => :updated_record_after }.freeze
Instance Method Summary collapse
-
#after_attributes(changes, model_class) ⇒ Hash[untyped, untyped]
: (untyped, untyped) -> Hash[untyped, untyped].
-
#apply_changes(record, changes) ⇒ Object
: (untyped, untyped) -> untyped.
-
#changed_record_after(version) ⇒ Object
: (untyped) -> untyped.
-
#created_record_after(version) ⇒ Object
: (untyped) -> untyped.
-
#deserialized_changeset(version, model_class) ⇒ Object
Mirrors PaperTrail's changeset deserialization without resolving
version.item, which would issue one live-record query per event. -
#initialize(record_transition: nil) ⇒ ActivityEventRecordResolver
constructor
: (?record_transition: untyped) -> void.
-
#record_after(version) ⇒ Object
: (untyped) -> untyped.
-
#snapshot_delta(version) ⇒ ActivitySnapshotDelta?
: (untyped) -> ActivitySnapshotDelta?.
-
#standard_changeset(paper_trail, version, model_class) ⇒ Object
: (untyped, untyped, untyped) -> untyped.
-
#updated_record_after(version) ⇒ Object
: (untyped) -> untyped.
Constructor Details
#initialize(record_transition: nil) ⇒ ActivityEventRecordResolver
: (?record_transition: untyped) -> void
14 15 16 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 14 def initialize(record_transition: nil) @record_transition = record_transition end |
Instance Method Details
#after_attributes(changes, model_class) ⇒ Hash[untyped, untyped]
: (untyped, untyped) -> Hash[untyped, untyped]
87 88 89 90 91 92 93 94 95 96 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 87 def after_attributes(changes, model_class) names = model_class.attribute_names attributes = {} #: Hash[untyped, untyped] changes.each do |name, values| next unless names.include?(name.to_s) attributes[name] = values.last end attributes end |
#apply_changes(record, changes) ⇒ Object
: (untyped, untyped) -> untyped
99 100 101 102 103 104 105 106 107 108 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 99 def apply_changes(record, changes) return unless record && changes.respond_to?(:each) && !changes.empty? changes.each do |name, values| next unless record.has_attribute?(name) && values.respond_to?(:last) record[name] = values.last end record end |
#changed_record_after(version) ⇒ Object
: (untyped) -> untyped
48 49 50 51 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 48 def changed_record_after(version) handler = RECORD_AFTER_HANDLERS[version.event.to_s] send(handler, version) if handler end |
#created_record_after(version) ⇒ Object
: (untyped) -> untyped
54 55 56 57 58 59 60 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 54 def created_record_after(version) model_class = Endpoint.model_class(version) changes = deserialized_changeset(version, model_class) return unless changes.respond_to?(:each) && !changes.empty? model_class.new(after_attributes(changes, model_class)) end |
#deserialized_changeset(version, model_class) ⇒ Object
Mirrors PaperTrail's changeset deserialization without resolving
version.item, which would issue one live-record query per event.
: (untyped, untyped) -> untyped
72 73 74 75 76 77 78 79 80 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 72 def deserialized_changeset(version, model_class) return unless model_class && version.class.column_names.include?('object_changes') paper_trail = Object.const_get(:PaperTrail) #: untyped adapter = paper_trail.config.object_changes_adapter return adapter.load_changeset(version) if adapter.respond_to?(:load_changeset) standard_changeset(paper_trail, version, model_class) end |
#record_after(version) ⇒ Object
: (untyped) -> untyped
19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 19 def record_after(version) return if version.event.to_s == 'destroy' changed_record = changed_record_after(version) return changed_record if changed_record successor = version.next record = successor&.reify(dup: true) return record if record model_class = Endpoint.model_class(version) criteria = { model_class.primary_key => version.item_id } #: Hash[untyped, untyped] model_class.unscoped.find_by(criteria) end |
#snapshot_delta(version) ⇒ ActivitySnapshotDelta?
: (untyped) -> ActivitySnapshotDelta?
35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 35 def snapshot_delta(version) return unless version.event.to_s == 'update' && version.object transition = @record_transition&.call(version) return unless transition ActivitySnapshotDelta.new( before_attributes: transition.fetch(0), after_attributes: transition.fetch(1) ) end |
#standard_changeset(paper_trail, version, model_class) ⇒ Object
: (untyped, untyped, untyped) -> untyped
111 112 113 114 115 116 117 118 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 111 def standard_changeset(paper_trail, version, model_class) raw_changes = version.send(:object_changes_deserialized) active_support = Object.const_get(:ActiveSupport) #: untyped changes = active_support.const_get(:HashWithIndifferentAccess).new(raw_changes) serializers = paper_trail.const_get(:AttributeSerializers) serializers.const_get(:ObjectChangesAttribute).new(model_class).deserialize(changes) changes end |
#updated_record_after(version) ⇒ Object
: (untyped) -> untyped
63 64 65 66 67 |
# File 'lib/paper_trail_diff/activity_event_record_resolver.rb', line 63 def updated_record_after(version) record = version.reify(dup: true) changes = deserialized_changeset(version, record&.class) apply_changes(record, changes) end |