module Dynamoid::Associations::ManyAssociation

Attributes

query[RW]

Public Class Methods

new(*args) click to toggle source
# File lib/dynamoid/associations/many_association.rb, line 10
def initialize(*args)
  @query = {}
  super
end

Public Instance Methods

<<(object) click to toggle source

Add an object or array of objects to an association.

tag.posts << post
tag.posts << [post1, post2, post3]

This preserves the current records in the association (if any) and adds the object to the target association if it is detected to exist.

It saves both models immediately - the source model and the target one so any not saved changes will be saved as well.

@param object [Dynamoid::Document|Array] model (or array of models) to add to the association @return [Dynamoid::Document] the added model @since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 89
def <<(object)
  associate(Array(object).collect(&:hash_key))

  if target_association
    Array(object).each { |obj| obj.send(target_association).associate(source.hash_key) }
  end

  object
end
==(other) click to toggle source

Is this array equal to the association’s records?

@return [Boolean] true/false

@since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 206
def ==(other)
  records == Array(other)
end
all()

Alias convenience methods for the associations.

Alias for: records
associate(hash_key) click to toggle source

@private

# File lib/dynamoid/associations/many_association.rb, line 223
def associate(hash_key)
  source.update_attribute(source_attribute, source_ids.merge(Array(hash_key)))
end
create(attributes = {}) click to toggle source

Create a new instance of the target class, persist it and add directly to the association.

tag.posts.create(title: 'foo')

Several models can be created at once when an array of attributes specified:

tag.posts.create([{ title: 'foo' }, {title: 'bar'} ])

@param attributes [Hash] attribute values for the new object @return [Dynamoid::Document|Array] the newly-created object @since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 146
def create(attributes = {})
  self << target_class.create(attributes)
end
create!(attributes = {}) click to toggle source

Create a new instance of the target class, persist it and add directly to the association.

tag.posts.create!(title: 'foo')

Several models can be created at once when an array of attributes specified:

tag.posts.create!([{ title: 'foo' }, {title: 'bar'} ])

If the creation fails an exception will be raised.

@param attributes [Hash] attribute values for the new object @return [Dynamoid::Document|Array] the newly-created object @since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 129
def create!(attributes = {})
  self << target_class.create!(attributes)
end
delete(object) click to toggle source

Delete an object or array of objects from the association.

tag.posts.delete(post)
tag.posts.delete([post1, post2, post3])

This removes their records from the association field on the source, and attempts to remove the source from the target association if it is detected to exist.

It saves both models immediately - the source model and the target one so any not saved changes will be saved as well.

@param object [Dynamoid::Document|Array] model (or array of models) to remove from the association @return [Dynamoid::Document|Array] the deleted model @since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 67
def delete(object)
  disassociate(Array(object).collect(&:hash_key))
  if target_association
    Array(object).each { |obj| obj.send(target_association).disassociate(source.hash_key) }
  end
  object
end
delete_all() click to toggle source

Deletes all members of the association and removes them from the association.

tag.posts.delete_all

@since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 178
def delete_all
  objs = target
  source.update_attribute(source_attribute, nil)
  objs.each(&:delete)
end
destroy_all() click to toggle source

Destroys all members of the association and removes them from the association.

tag.posts.destroy_all

@since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 166
def destroy_all
  objs = target
  source.update_attribute(source_attribute, nil)
  objs.each(&:destroy)
end
disassociate(hash_key) click to toggle source

@private

# File lib/dynamoid/associations/many_association.rb, line 228
def disassociate(hash_key)
  source.update_attribute(source_attribute, source_ids - Array(hash_key))
end
each(&block) click to toggle source

Create a new instance of the target class and add it directly to the association. If the create fails an exception will be raised.

@return [Dynamoid::Document] the newly-created object

@private @since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 156
def each(&block)
  records.each(&block)
end
find_target() click to toggle source

The records associated to the source.

@return the association records; depending on which association this is, either a single instance or an array

@private @since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 27
def find_target
  return [] if source_ids.empty?

  Array(target_class.find(source_ids.to_a, raise_error: false))
end
include?(object) click to toggle source

Delegate include? to the records.

# File lib/dynamoid/associations/many_association.rb, line 48
def include?(object)
  records.include?(object)
end
method_missing(method, *args) click to toggle source

Delegate methods we don’t find directly to the records array.

@private @since 0.2.0

Calls superclass method
# File lib/dynamoid/associations/many_association.rb, line 214
def method_missing(method, *args)
  if records.respond_to?(method)
    records.send(method, *args)
  else
    super
  end
end
records() click to toggle source

@private

# File lib/dynamoid/associations/many_association.rb, line 34
def records
  if query.empty?
    target
  else
    results_with_query(target)
  end
end
Also aliased as: all
setter(object) click to toggle source

Replace an association with object or array of objects. This removes all of the existing associated records and replaces them with the passed object(s), and associates the target association if it is detected to exist.

@param [Dynamoid::Document] object the object (or array of objects) to add to the association

@return [Dynamoid::Document|Array] the added object

@private @since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 108
def setter(object)
  target.each { |o| delete(o) }
  self << object
  object
end
where(args) click to toggle source

Naive association filtering.

tag.posts.where(title: 'foo')

It loads lazily all the associated models and checks provided conditions. That’s why only equality conditions can be specified.

@param args [Hash] A hash of attributes; each must match every returned object’s attribute exactly. @return [Dynamoid::Association] the association this method was called on (for chaining purposes) @since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 194
def where(args)
  filtered = clone
  filtered.query = query.clone
  args.each { |k, v| filtered.query[k] = v }
  filtered
end

Private Instance Methods

results_with_query(results) click to toggle source

If a query exists, filter all existing results based on that query.

@param [Array] results the raw results for the association

@return [Array] the filtered results for the query

@since 0.2.0

# File lib/dynamoid/associations/many_association.rb, line 241
def results_with_query(results)
  results.find_all do |result|
    query.all? do |attribute, value|
      result.send(attribute) == value
    end
  end
end