class StoreModel::Types::OnePolymorphic
Implements ActiveModel::Type::Value type for handling an instance of StoreModel::Model
Public Class Methods
new(model_wrapper)
click to toggle source
Initializes type for model class
@param model_wrapper [Proc] class to handle
@return [StoreModel::Types::OnePolymorphic ]
# File lib/store_model/types/one_polymorphic.rb, line 16 def initialize(model_wrapper) @model_wrapper = model_wrapper end
Public Instance Methods
cast_value(value)
click to toggle source
Casts value
from DB or user to StoreModel::Model
instance
@param value [Object] a value to cast
@return StoreModel::Model
# File lib/store_model/types/one_polymorphic.rb, line 32 def cast_value(value) case value when String then decode_and_initialize(value) when Hash then extract_model_klass(value).new(value) when nil then value else raise_cast_error(value) unless value.class.ancestors.include?(StoreModel::Model) value end rescue ActiveModel::UnknownAttributeError => e handle_unknown_attribute(value, e) end
serialize(value)
click to toggle source
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
Calls superclass method
# File lib/store_model/types/one_polymorphic.rb, line 52 def serialize(value) case value when Hash ActiveSupport::JSON.encode(value) else return ActiveSupport::JSON.encode(value) if implements_model?(value.class) super end end
type()
click to toggle source
Returns type
@return [Symbol]
# File lib/store_model/types/one_polymorphic.rb, line 23 def type :polymorphic end
Protected Instance Methods
extract_model_klass(value)
click to toggle source
Check if block returns an appropriate class and raise cast error if not
@param value [Object] raw data
@return [Class] which implements StoreModel::Model
# File lib/store_model/types/one_polymorphic.rb, line 70 def extract_model_klass(value) model_klass = @model_wrapper.call(value) raise_extract_wrapper_error(model_klass) unless implements_model?(model_klass) model_klass end
model_instance(value)
click to toggle source
# File lib/store_model/types/one_polymorphic.rb, line 84 def model_instance(value) extract_model_klass(value).new(value) end
raise_cast_error(value)
click to toggle source
# File lib/store_model/types/one_polymorphic.rb, line 78 def raise_cast_error(value) raise StoreModel::Types::CastError, "failed casting #{value.inspect}, only String, " \ "Hash or instances which implement StoreModel::Model are allowed" end