class Aws::Record::Attribute

This class provides helper methods for Aws::Record attributes. These include marshalers for type casting of item attributes, the Amazon DynamoDB type for use in certain table and item operation calls, and the ability to define a database name that is separate from the name used within the model class and item instances.

Attributes

database_name[R]
dynamodb_type[R]
name[R]

Public Class Methods

new(name, options = {}) click to toggle source

@param [Symbol] name Name of the attribute. It should be a name that is

safe to use as a method.

@param [Hash] options @option options [Marshaler] :marshaler The marshaler for this attribute.

So long as you provide a marshaler which implements +#type_cast+ and
+#serialize+ that consume raw values as expected, you can bring your
own marshaler type.

@option options [String] :database_attribute_name Optional attribute

used to specify a different name for database persistence than the
`name` parameter. Must be unique (you can't have overlap between
database attribute names and the names of other attributes).

@option options [String] :dynamodb_type Generally used for keys and

index attributes, one of "S", "N", "B", "BOOL", "SS", "NS", "BS",
"M", "L". Optional if this attribute will never be used for a key or
secondary index, but most convenience methods for setting attributes
will provide this.

@option options [Boolean] :persist_nil Optional attribute used to

indicate whether nil values should be persisted. If true, explicitly
set nil values will be saved to DynamoDB as a "null" type. If false,
nil values will be ignored and not persisted. By default, is false.

@option options [Object] :default_value Optional attribute used to

define a "default value" to be used if the attribute's value on an
item is nil or not set at persistence time.
# File lib/aws-record/record/attribute.rb, line 49
def initialize(name, options = {})
  @name = name
  @database_name = (options[:database_attribute_name]  || name).to_s
  @dynamodb_type = options[:dynamodb_type]
  @marshaler = options[:marshaler] || DefaultMarshaler
  @persist_nil = options[:persist_nil]
  dv = options[:default_value]
  @default_value_or_lambda = _is_lambda?(dv) ? dv : type_cast(dv)
end

Public Instance Methods

default_value() click to toggle source

@api private

# File lib/aws-record/record/attribute.rb, line 94
def default_value
  if _is_lambda?(@default_value_or_lambda)
    type_cast(@default_value_or_lambda.call)
  else
    _deep_copy(@default_value_or_lambda)
  end
end
extract(dynamodb_item) click to toggle source

@api private

# File lib/aws-record/record/attribute.rb, line 89
def extract(dynamodb_item)
  dynamodb_item[@database_name]
end
persist_nil?() click to toggle source

@return [Boolean] true if this attribute will actively persist nil

values, false otherwise. Default: false
# File lib/aws-record/record/attribute.rb, line 84
def persist_nil?
  @persist_nil ? true : false
end
serialize(raw_value) click to toggle source

Attempts to serialize a raw value into the attribute's serialized storage type. This call will forward the raw value to this attribute's marshaler class.

@return [Object] the serialized object. Return type is dependent on the

marshaler used. See your attribute's marshaler class for details.
# File lib/aws-record/record/attribute.rb, line 76
def serialize(raw_value)
  cast_value = type_cast(raw_value)
  cast_value = default_value if cast_value.nil?
  @marshaler.serialize(cast_value)
end
type_cast(raw_value) click to toggle source

Attempts to type cast a raw value into the attribute's type. This call will forward the raw value to this attribute's marshaler class.

@return [Object] the type cast object. Return type is dependent on the

marshaler used. See your attribute's marshaler class for details.
# File lib/aws-record/record/attribute.rb, line 64
def type_cast(raw_value)
  cast_value = @marshaler.type_cast(raw_value)
  cast_value = default_value if cast_value.nil?
  cast_value
end

Private Instance Methods

_deep_copy(obj) click to toggle source
# File lib/aws-record/record/attribute.rb, line 103
def _deep_copy(obj)
  Marshal.load(Marshal.dump(obj))
end
_is_lambda?(obj) click to toggle source
# File lib/aws-record/record/attribute.rb, line 107
def _is_lambda?(obj)
  obj.respond_to?(:call)
end