Module: Freezer::Serialization::HStore
- Defined in:
- lib/freezer/hstore_serialization.rb,
lib/freezer/serialization/hstore.rb
Constant Summary collapse
- SERIALIZABLE_TYPES =
[ :primary_key, :string, :text, :integer, :float, :decimal, :datetime,:timestamp, :time, :date, :boolean ].freeze
Class Method Summary collapse
- .deserialize(klass, attributes, silent = false) ⇒ Object
- .deserialize_key(serialized) ⇒ Object
- .deserialize_value(type, value) ⇒ Object
-
.serialize(record) ⇒ Object
TODO give each version its own module or something.
- .serialize_key(key, type) ⇒ Object
- .serialize_value(type, value) ⇒ Object
Class Method Details
.deserialize(klass, attributes, silent = false) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/freezer/hstore_serialization.rb', line 30 def deserialize(klass, attributes, silent = false) attributes = attributes.dup sv = attributes.delete(':sv') raise ArgumentError, "Unknown serialization format #{sv.to_s}" unless sv == '1' attributes = attributes.inject({}) do |hash,(key,value)| real_key, type = deserialize_key(key) hash[real_key] = deserialize_value(type, value) hash end FrozenRecordFactory.build(klass, attributes, silent) end |
.deserialize_key(serialized) ⇒ Object
46 47 48 49 |
# File 'lib/freezer/hstore_serialization.rb', line 46 def deserialize_key(serialized) m = serialized.match(/(.*):([^:]+)\z/) [m[1].gsub('::',':'), m[2].to_sym] end |
.deserialize_value(type, value) ⇒ Object
57 58 59 60 61 62 |
# File 'lib/freezer/hstore_serialization.rb', line 57 def deserialize_value(type, value) raise ArgumentError, "Do not know how to deserialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type return nil if value.nil? # For now, we will let AR handle the casting for us value.to_s end |
.serialize(record) ⇒ Object
TODO give each version its own module or something
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/freezer/hstore_serialization.rb', line 14 def serialize(record) # Start with the serialization format version string hstore = {':sv'=>'1'} columns = record.class.columns attributes = record.attributes columns.each do |column| key = serialize_key(column.name, column.type) value = serialize_value(column.type, attributes[column.name]) hstore[key] = value end hstore end |
.serialize_key(key, type) ⇒ Object
42 43 44 |
# File 'lib/freezer/hstore_serialization.rb', line 42 def serialize_key(key, type) "#{key.gsub(':','::')}:#{type}" end |
.serialize_value(type, value) ⇒ Object
51 52 53 54 55 |
# File 'lib/freezer/hstore_serialization.rb', line 51 def serialize_value(type, value) raise ArgumentError, "Do not know how to serialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type return nil if value.nil? value.to_s end |