class PaperTrail::AttributeSerializers::ObjectChangesAttribute

Serialize or deserialize the `version.object_changes` column.

Public Class Methods

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

Public Instance Methods

deserialize(changes) click to toggle source
# File lib/mongo_trails/attribute_serializers/object_changes_attribute.rb, line 17
def deserialize(changes)
  alter(changes, :deserialize)
end
serialize(changes) click to toggle source
# File lib/mongo_trails/attribute_serializers/object_changes_attribute.rb, line 13
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/mongo_trails/attribute_serializers/object_changes_attribute.rb, line 25
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
object_changes_col_is_json?() click to toggle source
# File lib/mongo_trails/attribute_serializers/object_changes_attribute.rb, line 39
def object_changes_col_is_json?
  @item_class.paper_trail.version_class.object_changes_col_is_json?
end