A hash with column name symbols and callable values, with the value called to deserialize the column.
A hash with column name symbols and callable values, with the value called to serialize the column.
Freeze serialization metadata when freezing model class.
# File lib/sequel/plugins/serialization.rb, line 117 def freeze @deserialization_map.freeze @serialization_map.freeze @serialization_module.freeze if @serialization_module super end
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 127 def serialize_attributes(format, *columns) if format.is_a?(Symbol) unless format = Sequel.synchronize{REGISTERED_FORMATS[format]} raise(Error, "Unsupported serialization format: #{format} (valid formats: #{Sequel.synchronize{REGISTERED_FORMATS.keys}.map(&: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
Add serializated attribute acessor methods to the serialization_module
# File lib/sequel/plugins/serialization.rb, line 141 def define_serialized_attribute_accessor(serializer, deserializer, *columns) m = self include(@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| cc = changed_columns if !cc.include?(column) && (new? || get_column_value(column) != v) cc << column will_change_column(column) if respond_to?(:will_change_column) end deserialized_values[column] = v end end end end