module Sequel::Plugins::Serialization::ClassMethods
Attributes
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.
Public Instance Methods
Source
# 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
Freeze serialization metadata when freezing model class.
Source
# 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
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.
Private Instance Methods
Source
# File lib/sequel/plugins/serialization.rb 147 def define_serialized_attribute_accessor(serializer, deserializer, *columns) 148 m = self 149 include(@serialization_module ||= Sequel.set_temp_name(Module.new){"#{name}::@serialization_module"}) 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
Add serializated attribute acessor methods to the serialization_module