Sha256: 28660411f48dbe99352657ebf803759abe593108c49b214543899e844cfdc468
Contents?: true
Size: 1.76 KB
Versions: 9
Compression:
Stored size: 1.76 KB
Contents
# frozen_string_literal: true require "active_model" module StoreModel module Types # Implements ActiveModel::Type::Value type for handling an instance of StoreModel::Model class One < OneBase # Initializes type for model class # # @param model_klass [StoreModel::Model] model class to handle # # @return [StoreModel::Types::One] def initialize(model_klass) @model_klass = model_klass end # Returns type # # @return [Symbol] def type :json end # Casts +value+ from DB or user to StoreModel::Model instance # # @param value [Object] a value to cast # # @return StoreModel::Model def cast_value(value) case value when String then decode_and_initialize(value) when Hash then model_instance(value) when @model_klass, nil then value else raise_cast_error(value) end rescue ActiveModel::UnknownAttributeError => e handle_unknown_attribute(value, e) end # Casts a value from the ruby type to a type that the database knows how # to understand. # # @param value [Object] value to serialize # # @return [String] serialized value def serialize(value) case value when Hash, @model_klass ActiveSupport::JSON.encode(value, serialize_unknown_attributes: true) else super end end private def raise_cast_error(value) raise StoreModel::Types::CastError, "failed casting #{value.inspect}, only String, " \ "Hash or #{@model_klass.name} instances are allowed" end def model_instance(value) @model_klass.new(value) end end end end
Version data entries
9 entries across 9 versions & 1 rubygems