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.

Public Instance Methods

freeze() click to toggle source

Freeze serialization metadata when freezing model class.

Calls superclass method
    # File lib/sequel/plugins/serialization.rb
118 def freeze
119   @deserialization_map.freeze
120   @serialization_map.freeze
121   @serialization_module.freeze if @serialization_module
122 
123   super
124 end
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. If format is a symbol, it should correspond to a previously-registered format using register_format. Otherwise, format is expected to be a 2-element array of callables, with the first element being the serializer, used to convert the value used by the application to the value that will be stored in the database, and the second element being the deserializer, used to convert the value stored the database to the value used by the application.

    # File lib/sequel/plugins/serialization.rb
133 def serialize_attributes(format, *columns)
134   if format.is_a?(Symbol)
135     unless format = Sequel.synchronize{REGISTERED_FORMATS[format]}
136       raise(Error, "Unsupported serialization format: #{format} (valid formats: #{Sequel.synchronize{REGISTERED_FORMATS.keys}.inspect})")
137     end
138   end
139   serializer, deserializer = format
140   raise(Error, "No columns given.  The serialization plugin requires you specify which columns to serialize") if columns.empty?
141   define_serialized_attribute_accessor(serializer, deserializer, *columns)
142 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
147 def define_serialized_attribute_accessor(serializer, deserializer, *columns)
148   m = self
149   include(@serialization_module ||= Module.new) unless @serialization_module
150   @serialization_module.class_eval do
151     columns.each do |column|
152       m.serialization_map[column] = serializer
153       m.deserialization_map[column] = deserializer
154       define_method(column) do 
155         if deserialized_values.has_key?(column)
156           deserialized_values[column]
157         elsif frozen?
158           deserialize_value(column, super())
159         else
160           deserialized_values[column] = deserialize_value(column, super())
161         end
162       end
163       alias_method(column, column)
164 
165       setter = :"#{column}="
166       define_method(setter) do |v| 
167         cc = changed_columns
168         if !cc.include?(column) && (new? || get_column_value(column) != v)
169           cc << column
170 
171           will_change_column(column) if respond_to?(:will_change_column)
172         end
173 
174         deserialized_values[column] = v
175       end
176       alias_method(setter, setter)
177     end
178   end
179 end