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