Module: Dynamoid::Fields::ClassMethods

Defined in:
lib/dynamoid/fields.rb

Instance Method Summary collapse

Instance Method Details

#field(name, type = :string, options = {}) ⇒ Object

Specify a field for a document.

Its type determines how it is coerced when read in and out of the datastore. You can specify :integer, :number, :set, :array, :datetime, :date and :serialized, or specify a class that defines a serialization strategy.

If you specify a class for field type, Dynamoid will serialize using ‘dynamoid_dump` or `dump` methods, and load using `dynamoid_load` or `load` methods.

Default field type is :string.

Parameters:

  • name (Symbol)

    the name of the field

  • type (Symbol) (defaults to: :string)

    the type of the field (refer to method description for details)

  • options (Hash) (defaults to: {})

    any additional options for the field

Since:

  • 0.2.0



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/dynamoid/fields.rb', line 47

def field(name, type = :string, options = {})
  named = name.to_s
  if type == :float
    Dynamoid.logger.warn("Field type :float, which you declared for '#{name}', is deprecated in favor of :number.")
    type = :number
  end
  self.attributes = attributes.merge(name => { type: type }.merge(options))

  generated_methods.module_eval do
    define_method(named) { read_attribute(named) }
    define_method("#{named}?") do
      value = read_attribute(named)
      case value
      when true        then true
      when false, nil  then false
      else
        !value.nil?
      end
    end
    define_method("#{named}=") { |value| write_attribute(named, value) }
    define_method("#{named}_before_type_cast") { read_attribute_before_type_cast(named) }
  end
end

#range(name, type = :string, options = {}) ⇒ Object



71
72
73
74
# File 'lib/dynamoid/fields.rb', line 71

def range(name, type = :string, options = {})
  field(name, type, options)
  self.range_key = name
end

#remove_field(field) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
# File 'lib/dynamoid/fields.rb', line 84

def remove_field(field)
  field = field.to_sym
  attributes.delete(field) || raise('No such field')

  generated_methods.module_eval do
    remove_method field
    remove_method :"#{field}="
    remove_method :"#{field}?"
    remove_method :"#{field}_before_type_cast"
  end
end

#table(_options) ⇒ Object



76
77
78
79
80
81
82
# File 'lib/dynamoid/fields.rb', line 76

def table(_options)
  # a default 'id' column is created when Dynamoid::Document is included
  unless attributes.key? hash_key
    remove_field :id
    field(hash_key)
  end
end