lib/dynamoid/document.rb in dynamoid-0.4.1 vs lib/dynamoid/document.rb in dynamoid-0.5.0
- old
+ new
@@ -4,47 +4,47 @@
# This is the base module for all domain objects that need to be persisted to
# the database as documents.
module Document
extend ActiveSupport::Concern
include Dynamoid::Components
-
+
included do
class_attribute :options
self.options = {}
-
+
Dynamoid::Config.included_models << self
end
-
+
module ClassMethods
- # Set up table options, including naming it whatever you want, setting the id key, and manually overriding read and
+ # Set up table options, including naming it whatever you want, setting the id key, and manually overriding read and
# write capacity.
- #
+ #
# @param [Hash] options options to pass for this table
# @option options [Symbol] :name the name for the table; this still gets namespaced
# @option options [Symbol] :id id column for the table
# @option options [Integer] :read_capacity set the read capacity for the table; does not work on existing tables
# @option options [Integer] :write_capacity set the write capacity for the table; does not work on existing tables
#
# @since 0.4.0
def table(options = {})
self.options = options
end
-
+
# Returns the read_capacity for this table.
#
# @since 0.4.0
def read_capacity
options[:read_capacity] || Dynamoid::Config.read_capacity
end
-
+
# Returns the write_capacity for this table.
#
# @since 0.4.0
def write_capacity
options[:write_capacity] || Dynamoid::Config.write_capacity
end
-
+
# Returns the id field for this class.
#
# @since 0.4.0
def hash_key
options[:key] || :id
@@ -69,11 +69,11 @@
#
# @since 0.2.0
def create!(attrs = {})
new(attrs).tap(&:save!)
end
-
+
# Initialize a new object.
#
# @param [Hash] attrs Attributes with which to create the object.
#
# @return [Dynamoid::Document] the new document
@@ -99,52 +99,81 @@
#
# @param [Hash] attrs Attributes with which to create the object.
#
# @return [Dynamoid::Document] the new document
#
- # @since 0.2.0
+ # @since 0.2.0
def initialize(attrs = {})
- self.class.send(:field, self.class.hash_key) unless self.respond_to?(self.class.hash_key)
-
- @new_record = true
- @attributes ||= {}
- @associations ||= {}
+ run_callbacks :initialize do
+ self.class.send(:field, self.class.hash_key) unless self.respond_to?(self.class.hash_key)
+ @new_record = true
+ @attributes ||= {}
+ @associations ||= {}
+
+ load(attrs)
+ end
+ end
+
+ def load(attrs)
self.class.undump(attrs).each {|key, value| send "#{key}=", value }
end
# An object is equal to another object if their ids are equal.
#
- # @since 0.2.0
+ # @since 0.2.0
def ==(other)
- return false if other.nil?
- other.respond_to?(:hash_key) && other.hash_key == self.hash_key
+ if self.class.identity_map_on?
+ super
+ else
+ return false if other.nil?
+ other.respond_to?(:hash_key) && other.hash_key == self.hash_key
+ end
end
- # Reload an object from the database -- if you suspect the object has changed in the datastore and you need those
+ # Reload an object from the database -- if you suspect the object has changed in the datastore and you need those
# changes to be reflected immediately, you would call this method.
#
# @return [Dynamoid::Document] the document this method was called on
#
- # @since 0.2.0
+ # @since 0.2.0
def reload
- self.attributes = self.class.find(self.hash_key).attributes
+ self.attributes = self.class.find(hash_key, :range_key => range_value).attributes
@associations.values.each(&:reset)
self
end
-
+
# Return an object's hash key, regardless of what it might be called to the object.
#
# @since 0.4.0
def hash_key
self.send(self.class.hash_key)
end
-
+
# Assign an object's hash key, regardless of what it might be called to the object.
#
# @since 0.4.0
- def hash_key=(key)
- self.send("#{self.class.hash_key}=".to_sym, key)
+ def hash_key=(value)
+ self.send("#{self.class.hash_key}=", value)
end
+
+ def range_value
+ if range_key = self.class.range_key
+ self.send(range_key)
+ end
+ end
+
+ def range_value=(value)
+ self.send("#{self.class.range_key}=", value)
+ end
+
+ def range_value
+ if range_key = self.class.range_key
+ self.send(range_key)
+ end
+ end
+
+ def range_value=(value)
+ self.send("#{self.class.range_key}=", value)
+ end
end
-
end