require 'json' class JSONColumnCoder attr_accessor :object_class def initialize(object_class = Object) @object_class = object_class end def dump(obj) return if obj.nil? unless obj.is_a?(object_class) raise ActiveRecord::SerializationTypeMismatch, "Attribute was supposed to be a #{object_class}, but was a #{obj.class}. -- #{obj.inspect}" end JSON.dump obj end def load(json) return object_class.new if object_class != Object && json.nil? return json unless json.is_a?(String) obj = JSON.load(json) unless obj.is_a?(object_class) || obj.nil? raise ActiveRecord::SerializationTypeMismatch, "Attribute was supposed to be a #{object_class}, but was a #{obj.class}" end obj ||= object_class.new if object_class != Object obj end end