class StoreModel::Types::OneBase

Implements ActiveModel::Type::Value type for handling an instance of StoreModel::Model

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_base.rb, line 21
def cast_value(_value)
  raise NotImplementedError
end
changed_in_place?(raw_old_value, new_value) click to toggle source

Determines whether the mutable value has been modified since it was read

@param raw_old_value [Object] old value @param new_value [Object] new value

@return [Boolean]

# File lib/store_model/types/one_base.rb, line 31
def changed_in_place?(raw_old_value, new_value)
  cast_value(raw_old_value) != new_value
end
type() click to toggle source

Returns type

@return [Symbol]

# File lib/store_model/types/one_base.rb, line 12
def type
  raise NotImplementedError
end

Protected Instance Methods

model_instance(_value) click to toggle source
# File lib/store_model/types/one_base.rb, line 41
def model_instance(_value)
  raise NotImplementedError
end
raise_cast_error(_value) click to toggle source
# File lib/store_model/types/one_base.rb, line 37
def raise_cast_error(_value)
  raise NotImplementedError
end

Private Instance Methods

decode_and_initialize(value) click to toggle source

rubocop:disable Style/RescueModifier

# File lib/store_model/types/one_base.rb, line 48
def decode_and_initialize(value)
  decoded = ActiveSupport::JSON.decode(value) rescue nil
  model_instance(decoded) unless decoded.nil?
rescue ActiveModel::UnknownAttributeError => e
  handle_unknown_attribute(decoded, e)
end
handle_unknown_attribute(value, exception) click to toggle source

rubocop:enable Style/RescueModifier

# File lib/store_model/types/one_base.rb, line 56
def handle_unknown_attribute(value, exception)
  attribute = exception.attribute.to_sym
  value_symbolized = value.symbolize_keys
  value_symbolized = value_symbolized[:attributes] if value_symbolized.key?(:attributes)

  cast_value(value_symbolized.except(attribute)).tap do |configuration|
    configuration.unknown_attributes[attribute.to_s] = value_symbolized[attribute]
  end
end