module Sequel::Plugins::Serialization::ClassMethods

Attributes

deserialization_map[R]

A hash with column name symbols and callable values, with the value called to deserialize the column.

serialization_map[R]

A hash with column name symbols and callable values, with the value called to serialize the column.

serialization_module[RW]

Module to store the serialized column accessor methods, so they can call be overridden and call super to get the serialization behavior

Public Instance Methods

serialize_attributes(format, *columns) click to toggle source

Create instance level reader that deserializes column values on request, and instance level writer that stores new deserialized values.

# File lib/sequel/plugins/serialization.rb, line 129
def serialize_attributes(format, *columns)
  if format.is_a?(Symbol)
    unless format = REGISTERED_FORMATS[format]
      raise(Error, "Unsupported serialization format: #{format} (valid formats: #{REGISTERED_FORMATS.keys.map{|k| k.inspect}.join})")
    end
  end
  serializer, deserializer = format
  raise(Error, "No columns given.  The serialization plugin requires you specify which columns to serialize") if columns.empty?
  define_serialized_attribute_accessor(serializer, deserializer, *columns)
end
serialized_columns() click to toggle source

The columns that will be serialized. This is only for backwards compatibility, use #serialization_map in new code.

# File lib/sequel/plugins/serialization.rb, line 142
def serialized_columns
  serialization_map.keys
end

Private Instance Methods

define_serialized_attribute_accessor(serializer, deserializer, *columns) click to toggle source

Add serializated attribute acessor methods to the #serialization_module

Calls superclass method
# File lib/sequel/plugins/serialization.rb, line 149
def define_serialized_attribute_accessor(serializer, deserializer, *columns)
  m = self
  include(self.serialization_module ||= Module.new) unless serialization_module
  serialization_module.class_eval do
    columns.each do |column|
      m.serialization_map[column] = serializer
      m.deserialization_map[column] = deserializer
      define_method(column) do 
        if deserialized_values.has_key?(column)
          deserialized_values[column]
        elsif frozen?
          deserialize_value(column, super())
        else
          deserialized_values[column] = deserialize_value(column, super())
        end
      end
      define_method("#{column}=") do |v| 
        if !changed_columns.include?(column) && (new? || get_column_value(column) != v)
          changed_columns << column
        end

        deserialized_values[column] = v
      end
    end
  end
end