Module: Dynamoid::Persistence::ClassMethods

Defined in:
lib/dynamoid/persistence.rb

Instance Method Summary collapse

Instance Method Details

#create_table(options = {}) ⇒ Object

Creates a table.

Parameters:

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

    options to pass for table creation

Options Hash (options):

  • :id (Symbol)

    the id field for the table

  • :table_name (Symbol)

    the actual name for the table

  • :read_capacity (Integer)

    set the read capacity for the table; does not work on existing tables

  • :write_capacity (Integer)

    set the write capacity for the table; does not work on existing tables

  • {range_key (Hash)

    > :type} a hash of the name of the range key and a symbol of its type

  • :hash_key_type (Symbol)

    the dynamo type of the hash key (:string or :number)

Since:

  • 0.4.0



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/dynamoid/persistence.rb', line 40

def create_table(options = {})
  if self.range_key
    range_key_hash = { range_key => dynamo_type(attributes[range_key][:type]) }
  else
    range_key_hash = nil
  end
  options = {
    :id => self.hash_key,
    :table_name => self.table_name,
    :write_capacity => self.write_capacity,
    :read_capacity => self.read_capacity,
    :range_key => range_key_hash,
    :hash_key_type => dynamo_type(attributes[self.hash_key][:type]),
    :local_secondary_indexes => self.local_secondary_indexes.values,
    :global_secondary_indexes => self.global_secondary_indexes.values
  }.merge(options)

  Dynamoid.adapter.create_table(options[:table_name], options[:id], options)
end

#dynamo_type(type) ⇒ Object



133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/dynamoid/persistence.rb', line 133

def dynamo_type(type)
  if type.is_a?(Class)
    type.respond_to?(:dynamoid_field_type) ? type.dynamoid_field_type : :string
  else
    case type
      when :integer, :number, :datetime
        :number
      when :string, :serialized
        :string
      else
        raise 'unknown type'
    end
  end
end

#from_database(attrs = {}) ⇒ Object



60
61
62
63
# File 'lib/dynamoid/persistence.rb', line 60

def from_database(attrs = {})
  clazz = attrs[:type] ? obj = attrs[:type].constantize : self
  clazz.new(attrs).tap { |r| r.new_record = false }
end

#table_nameObject



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/dynamoid/persistence.rb', line 18

def table_name
  table_base_name = options[:name] || base_class.name.split('::').last
    .downcase.pluralize
  table_prefix = if Dynamoid::Config.namespace.nil? then
    ''
  else
    "#{Dynamoid::Config.namespace}_"
  end

  @table_name ||= "#{table_prefix}#{table_base_name}"
end

#undump(incoming = nil) ⇒ Object

Undump an object into a hash, converting each type from a string representation of itself into the type specified by the field.

Since:

  • 0.2.0



68
69
70
71
72
73
74
75
76
# File 'lib/dynamoid/persistence.rb', line 68

def undump(incoming = nil)
  incoming = (incoming || {}).symbolize_keys
  Hash.new.tap do |hash|
    self.attributes.each do |attribute, options|
      hash[attribute] = undump_field(incoming[attribute], options)
    end
    incoming.each {|attribute, value| hash[attribute] = value unless hash.has_key? attribute }
  end
end

#undump_field(value, options) ⇒ Object

Undump a string value for a given type.

Since:

  • 0.2.0



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/dynamoid/persistence.rb', line 81

def undump_field(value, options)
  if (field_class = options[:type]).is_a?(Class)
    raise 'Dynamoid class-type fields do not support default values' if options[:default]

    if field_class.respond_to?(:dynamoid_load)
      field_class.dynamoid_load(value)
    end
  elsif options[:type] == :serialized
    if value.is_a?(String)
      options[:serializer] ? options[:serializer].load(value) : YAML.load(value)
    else
      value
    end
  else
    if value.nil? && (default_value = options[:default])
      value = default_value.respond_to?(:call) ? default_value.call : default_value
    end

    if !value.nil?
      case options[:type]
        when :string
          value.to_s
        when :integer
          Integer(value)
        when :number
          BigDecimal.new(value.to_s)
        when :array
          value.to_a
        when :set
          Set.new(value)
        when :datetime
          if value.is_a?(Date) || value.is_a?(DateTime) || value.is_a?(Time)
            value
          else
            Time.at(value).to_datetime
          end
        when :boolean
          # persisted as 't', but because undump is called during initialize it can come in as true
          if value == 't' || value == true
            true
          elsif value == 'f' || value == false
            false
          else
            raise ArgumentError, "Boolean column neither true nor false"
          end
        else
          raise ArgumentError, "Unknown type #{options[:type]}"
      end
    end
  end
end