class PaperTrail::AttributeSerializers::ObjectChangesAttribute

Serialize or deserialize the ‘version.object_changes` column.

Public Class Methods

new(item_class) click to toggle source
# File lib/paper_trail/attribute_serializers/object_changes_attribute.rb, line 9
def initialize(item_class)
  @item_class = item_class

  # ActiveRecord since 7.0 has a built-in encryption mechanism
  @encrypted_attributes =
    if PaperTrail.active_record_gte_7_0?
      @item_class.encrypted_attributes&.map(&:to_s)
    end
end

Public Instance Methods

deserialize(changes) click to toggle source
# File lib/paper_trail/attribute_serializers/object_changes_attribute.rb, line 23
def deserialize(changes)
  alter(changes, :deserialize)
end
serialize(changes) click to toggle source
# File lib/paper_trail/attribute_serializers/object_changes_attribute.rb, line 19
def serialize(changes)
  alter(changes, :serialize)
end

Private Instance Methods

alter(changes, serialization_method) click to toggle source

Modifies ‘changes` in place. TODO: Return a new hash instead.

# File lib/paper_trail/attribute_serializers/object_changes_attribute.rb, line 31
def alter(changes, serialization_method)
  # Don't serialize non-encrypted before values before inserting into columns of type
  # `JSON` on `PostgreSQL` databases.
  changes_to_serialize =
    object_changes_col_is_json? ? changes.slice(*@encrypted_attributes) : changes.clone
  return changes if changes_to_serialize.blank?

  serializer = CastAttributeSerializer.new(@item_class)
  changes_to_serialize.each do |key, change|
    # `change` is an Array with two elements, representing before and after.
    changes[key] = Array(change).map do |value|
      serializer.send(serialization_method, key, value)
    end
  end

  changes
end
object_changes_col_is_json?() click to toggle source
# File lib/paper_trail/attribute_serializers/object_changes_attribute.rb, line 49
def object_changes_col_is_json?
  @item_class.paper_trail.version_class.object_changes_col_is_json?
end