1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
# frozen_string_literal: true
require "paper_trail/attribute_serializers/cast_attribute_serializer"
module PaperTrail
module AttributeSerializers
# Serialize or deserialize the `version.object_changes` column.
class ObjectChangesAttribute
def initialize(item_class)
@item_class = item_class
end
def serialize(changes)
alter(changes, :serialize)
end
def deserialize(changes)
alter(changes, :deserialize)
end
private
# Modifies `changes` in place.
# TODO: Return a new hash instead.
def alter(changes, serialization_method)
# Don't serialize before values before inserting into columns of type
# `JSON` on `PostgreSQL` databases.
return changes if object_changes_col_is_json?
serializer = CastAttributeSerializer.new(@item_class)
changes.clone.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
end
def object_changes_col_is_json?
@item_class.paper_trail.version_class.object_changes_col_is_json?
end
end
end
end
|