module Mongoid::Persistable::Pushable

Defines behavior for $push and $addToSet operations.

@since 4.0.0

Public Instance Methods

add_to_set(adds) click to toggle source

Add the single values to the arrays only if the value does not already exist in the array.

@example Add the values to the sets.

document.add_to_set(names: "James", aliases: "Bond")

@param [ Hash ] adds The field/value pairs to add.

@return [ Document ] The document.

@since 4.0.0

# File lib/mongoid/persistable/pushable.rb, line 24
def add_to_set(adds)
  prepare_atomic_operation do |ops|
    process_atomic_operations(adds) do |field, value|
      existing = send(field) || attributes[field]
      if existing.nil?
        attributes[field] = []
        # Read the value out of attributes:
        # https://jira.mongodb.org/browse/MONGOID-4874
        existing = attributes[field]
      end
      values = [ value ].flatten(1)
      values.each do |val|
        existing.push(val) unless existing.include?(val)
      end
      ops[atomic_attribute_name(field)] = { "$each" => values }
    end
    { "$addToSet" => ops }
  end
end
push(pushes) click to toggle source

Push a single value or multiple values onto arrays.

@example Push a single value onto arrays.

document.push(names: "James", aliases: "007")

@example Push multiple values onto arrays.

document.push(names: [ "James", "Bond" ])

@param [ Hash ] pushes The $push operations.

@return [ Document ] The document.

@since 4.0.0

# File lib/mongoid/persistable/pushable.rb, line 57
def push(pushes)
  prepare_atomic_operation do |ops|
    process_atomic_operations(pushes) do |field, value|
      existing = send(field) || begin
        attributes[field] ||= []
        attributes[field]
      end
      values = [ value ].flatten(1)
      values.each{ |val| existing.push(val) }
      ops[atomic_attribute_name(field)] = { "$each" => values }
    end
    { "$push" => ops }
  end
end