module Mongoid::Extensions::Hash

Public Instance Methods

__consolidate__(klass) click to toggle source

Consolidate the key/values in the hash under an atomic $set.

@example Consolidate the hash.

{ name: "Placebo" }.__consolidate__

@return [ Hash ] A new consolidated hash.

@since 3.0.0

# File lib/mongoid/extensions/hash.rb, line 44
def __consolidate__(klass)
  consolidated = {}
  each_pair do |key, value|
    if key =~ /\$/
      value.each_pair do |_key, _value|
        value[_key] = (key == "$rename") ? _value.to_s : mongoize_for(key, klass, _key, _value)
      end
      consolidated[key] ||= {}
      consolidated[key].update(value)
    else
      consolidated["$set"] ||= {}
      consolidated["$set"].update(key => mongoize_for(key, klass, key, value))
    end
  end
  consolidated
end
__evolve_object_id__() click to toggle source

Evolves each value in the hash to an object id if it is convertable.

@example Convert the hash values.

{ field: id }.__evolve_object_id__

@return [ Hash ] The converted hash.

@since 3.0.0

# File lib/mongoid/extensions/hash.rb, line 16
def __evolve_object_id__
  update_values(&:__evolve_object_id__)
end
__mongoize_object_id__() click to toggle source

Mongoizes each value in the hash to an object id if it is convertable.

@example Convert the hash values.

{ field: id }.__mongoize_object_id__

@return [ Hash ] The converted hash.

@since 3.0.0

# File lib/mongoid/extensions/hash.rb, line 28
def __mongoize_object_id__
  if id = self['$oid']
    BSON::ObjectId.from_string(id)
  else
    update_values(&:__mongoize_object_id__)
  end
end
__nested__(string) click to toggle source

Fetch a nested value via dot syntax.

@example Fetch a nested value via dot syntax.

{ "name" => { "en" => "test" }}.__nested__("name.en")

@param [ String ] string the dot syntax string.

@return [ Object ] The matching value.

@since 3.0.15

# File lib/mongoid/extensions/hash.rb, line 146
def __nested__(string)
  keys = string.split(".")
  value = self
  keys.each do |key|
    return nil if value.nil?
    value_for_key = value[key]
    if value_for_key.nil? && key.to_i.to_s == key
      value_for_key = value[key.to_i]
    end
    value = value_for_key
  end
  value
end
_mongoid_unsatisfiable_criteria?() click to toggle source

Checks whether conditions given in this hash are known to be unsatisfiable, i.e., querying with this hash will always return no documents.

This method only handles condition shapes that Mongoid itself uses when it builds association queries. It does not guarantee that a false return value means the condition can produce a non-empty document set - only that if the return value is true, the condition always produces an empty document set.

@example Unsatisfiable conditions

{'_id' => {'$in' => []}}._mongoid_unsatisfiable_criteria?
# => true

@example Conditions which could be satisfiable

{'_id' => '123'}._mongoid_unsatisfiable_criteria?
# => false

@example Conditions which are unsatisfiable that this method does not handle

{'foo' => {'$in' => []}}._mongoid_unsatisfiable_criteria?
# => false

@return [ true | false ] Whether hash contains known unsatisfiable

conditions.

@api private

# File lib/mongoid/extensions/hash.rb, line 86
def _mongoid_unsatisfiable_criteria?
  unsatisfiable_criteria = { "_id" => { "$in" => [] }}
  return true if self == unsatisfiable_criteria
  return false unless length == 1 && keys == %w($and)
  value = values.first
  value.is_a?(Array) && value.any? do |sub_v|
    sub_v.is_a?(Hash) && sub_v._mongoid_unsatisfiable_criteria?
  end
end
Also aliased as: blank_criteria?
blank_criteria?()

Checks whether conditions given in this hash are known to be unsatisfiable, i.e., querying with this hash will always return no documents.

This method is deprecated. Mongoid now uses _mongoid_unsatisfiable_criteria? internally; this method is retained for backwards compatibility only.

@return [ true | false ] Whether hash contains known unsatisfiable

conditions.

@since 3.1.0 @deprecated

delete_id() click to toggle source

Deletes an id value from the hash.

@example Delete an id value.

{}.delete_id

@return [ Object ] The deleted value, or nil.

@since 3.0.2

# File lib/mongoid/extensions/hash.rb, line 119
def delete_id
  delete("_id") || delete(:_id) || delete("id") || delete(:id)
end
extract_id() click to toggle source

Get the id attribute from this hash, whether it’s prefixed with an underscore or is a symbol.

@example Extract the id.

{ :_id => 1 }.extract_id

@return [ Object ] The value of the id.

@since 2.3.2

# File lib/mongoid/extensions/hash.rb, line 132
def extract_id
  self["_id"] || self[:_id] || self["id"] || self[:id]
end
mongoize() click to toggle source

Turn the object from the ruby type we deal with to a Mongo friendly type.

@example Mongoize the object.

object.mongoize

@return [ Hash ] The object.

@since 3.0.0

# File lib/mongoid/extensions/hash.rb, line 169
def mongoize
  ::Hash.mongoize(self)
end
resizable?() click to toggle source

Can the size of this object change?

@example Is the hash resizable?

{}.resizable?

@return [ true ] true.

@since 3.0.0

# File lib/mongoid/extensions/hash.rb, line 181
def resizable?
  true
end
to_criteria() click to toggle source

Convert this hash to a criteria. Will iterate over each keys in the hash which must correspond to method on a criteria object. The hash must also include a “klass” key.

@example Convert the hash to a criteria.

{ klass: Band, where: { name: "Depeche Mode" }.to_criteria

@return [ Criteria ] The criteria.

@since 3.0.7

# File lib/mongoid/extensions/hash.rb, line 195
def to_criteria
  criteria = Criteria.new(delete(:klass) || delete("klass"))
  each_pair do |method, args|
    criteria = criteria.__send__(method, args)
  end
  criteria
end

Private Instance Methods

mongoize_for(operator, klass, key, value) click to toggle source

Mongoize for the klass, key and value.

@api private

@example Mongoize for the klass, field and value.

{}.mongoize_for("$push", Band, "name", "test")

@param [ String ] operator The operator. @param [ Class ] klass The model class. @param [ String, Symbol ] key The field key. @param [ Object ] value The value to mongoize.

@return [ Object ] The mongoized value.

@since 3.1.0

# File lib/mongoid/extensions/hash.rb, line 220
def mongoize_for(operator, klass, key, value)
  field = klass.fields[key.to_s]
  if field
    val = field.mongoize(value)
    if Mongoid::Persistable::LIST_OPERATIONS.include?(operator) && field.resizable?
      val = val.first if !value.is_a?(Array)
    end
    val
  else
    value
  end
end