module Emittance::Resque::EventSerializer::ActiveRecord

Essentially the same as the default serializer, with the added ability to store the metadata for ActiveRecord objects, so that it will re-fetch the record when the job is dequeued. Will serialize ActiveRecord objects even if inside of an array (or nested array), or if added as a value in a hash.

Public Class Methods

deserialize(event_hash) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 22
def deserialize(event_hash)
  identifier = event_hash['identifier']
  event_klass = Emittance::EventLookup.find_event_klass(identifier)

  emitter = deserialize_object(event_hash['emitter'])
  timestamp = deserialize_timestamp(event_hash['timestamp'])
  payload = deserialize_object(event_hash['payload'])

  event_klass.new(emitter, timestamp, payload)
end
serialize(event) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 13
def serialize(event)
  {
    identifier: event.identifiers.first,
    emitter: serialize_object(event.emitter),
    timestamp: serialize_timestamp(event.timestamp),
    payload: serialize_object(event.payload)
  }
end

Private Class Methods

deserialize_enum(obj) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 93
def deserialize_enum(obj)
  obj.map { |ele| deserialize_object(ele) }
end
deserialize_hash(obj) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 83
def deserialize_hash(obj)
  if obj['_persisted']
    deserialize_persisted(obj)
  else
    Hash[
      obj.map { |k, v| [k, deserialize_object(v)] }
    ]
  end
end
deserialize_object(obj) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 69
def deserialize_object(obj)
  if obj.is_a? Hash
    deserialize_hash(obj)
  elsif obj.is_a? Enumerable
    deserialize_enum(obj)
  else
    obj
  end
end
deserialize_persisted(obj) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 97
def deserialize_persisted(obj)
  klass = Object.const_get obj['persisted_type']
  klass.find obj['persisted_id']
end
deserialize_timestamp(time_i) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 79
def deserialize_timestamp(time_i)
  Time.at(time_i)
end
serialize_enum(obj) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 57
def serialize_enum(obj)
  obj.map { |ele| serialize_object(ele) }
end
serialize_hash(obj) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 51
def serialize_hash(obj)
  Hash[
    obj.map { |k, v| [k, serialize_object(v)] }
  ]
end
serialize_object(obj) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 35
def serialize_object(obj)
  if obj.is_a? Hash
    serialize_hash(obj)
  elsif obj.is_a? Enumerable
    serialize_enum(obj)
  elsif obj.is_a? ::ActiveRecord::Base
    serialize_persisted(obj)
  else
    obj
  end
end
serialize_persisted(obj) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 61
def serialize_persisted(obj)
  {
    _persisted: true,
    persisted_type: obj.class.name,
    persisted_id: obj.id
  }
end
serialize_timestamp(time) click to toggle source
# File lib/emittance/resque/event_serializer/active_record.rb, line 47
def serialize_timestamp(time)
  time.to_i
end