module DurableHash
Public Class Methods
deserializer(durable_hash_class, value_class)
click to toggle source
# File lib/durable_hash.rb, line 7 def self.deserializer(durable_hash_class, value_class) deserializer = deserializers[durable_hash_class][value_class] unless deserializer match_class = deserializers[durable_hash_class].keys.detect { |klass| value_class < klass } deserializer = deserializers[durable_hash_class][match_class] end deserializer end
included(includer)
click to toggle source
# File lib/durable_hash.rb, line 34 def self.included(includer) def includer.acts_as_durable_hash self.validates_uniqueness_of :key self.validates_presence_of :key, :value_class self.serialize :value def self.[](key) if record = find_by_key(key.to_s) record.value end end def self.[]=(key, value) if record = find_by_key(key.to_s) record.value = value record.save! else create! :key => key.to_s, :value => value end end self.before_validation do |record| record.value_class = record.value.class.name serializer = DurableHash.serializer(record.class, record.value.class) record.value = serializer.call(record.value) if serializer end if ActiveRecord::VERSION::MAJOR == 3 define_method(:durable_hash_after_find) do if attributes['value_class'] serializer = DurableHash.deserializer( self.class, value_class.constantize ) if serializer self.value = serializer.call self.value elsif value_class == 'Fixnum' self.value = self.value.to_i elsif value_class == 'Float' self.value = self.value.to_f end end end self.after_find :durable_hash_after_find else define_method(:after_find) do if attributes['value_class'] serializer = DurableHash.deserializer( self.class, value_class.constantize ) if serializer self.value = serializer.call self.value elsif value_class == 'Fixnum' self.value = self.value.to_i elsif value_class == 'Float' self.value = self.value.to_f end end end end if block_given? yield DurableHash::Builder.new(self) end end end
serializer(durable_hash_class, value_class)
click to toggle source
# File lib/durable_hash.rb, line 23 def self.serializer(durable_hash_class, value_class) serializer = serializers[durable_hash_class][value_class] unless serializer match_class = serializers[durable_hash_class].keys.detect { |klass| value_class < klass } serializer = serializers[durable_hash_class][match_class] end serializer end