38 lines
930 B
Ruby
38 lines
930 B
Ruby
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
|
|
|
|
# rails 6 does not eager load the JSONColumnCoder notation
|
|
class JsonColumnCoder < JSONColumnCoder
|
|
end
|