Módulo: Mongoide::Persistente::Configurable

Ampliado por:
ActiveSupport::Preocupación
Incluido en:
Mongoid::Persistable
Definido en:
lib/mongoid/persistable/settable.rb

Overview

Define el comportamiento de las operaciones $set.

Colapso del resumen del método de instancia

Detalles del método de instancia

#set(setters) ⇒ Documento

Realice una operación $set en los pares de campo/valor proporcionados y establezca los valores en el documento en la memoria.

La clave puede ser una secuencia de claves punteadas, en cuyo caso el campo de nivel superior se trata como un hash anidado y cualquier clave faltante se crea automáticamente:

Al realizar un conjunto anidado como este, se fusionan los valores de las claves intermedias:

Si el campo de nivel superior no era un hash, se descarta su valor original y el campo se reemplaza con un hash.

Tenga en cuenta que, a diferencia de $set de MongoDB, set de Mongoid escribe el campo completo, incluso al configurar un subconjunto del campo mediante la semántica hash anidada. Esto significa que ejecutar un $set con semántica hash anidada puede sobrescribir otras claves hash dentro del campo de nivel superior de la base de datos.

Ejemplos:

Establecer los valores.

document.set(title: "sir", dob: Date.new(1970, 1, 1))

Establezca los valores utilizando semántica hash anidada.

document.set('author.title' => 'Sir')
# => document.author == {'title' => 'Sir'}

Fusión de valores hash anidados.

document.set('author.title' => 'Sir')
document.set('author.name' => 'Linus Torvalds')
# => document.author == {'title' => 'Sir', 'name' => 'Linus Torvalds'}

Hash anidado que sobrescribe un valor que no es hash.

document.set('author' => 'John Doe')
document.set('author.title' => 'Sir')
# => document.author == {'title' => 'Sir'}

Parámetros:

  • setters (Hash)

    Los pares campo/valor a establecer.

Devuelve:



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# Archivo 'lib/mongoid/persistable/settable.rb', línea 48

def conjunto(setters)
  preparar_operación_atómica hacer |ops|
    operaciones atómicas del proceso(setters) hacer |Campo, valor|

      secuencia_de_campo = Campo.a_s.división('.')
      Campo = secuencia_de_campo.cambio
      Si secuencia_de_campo.longitud > 0
        # ruta hash anidada
        valor_antiguo = atributos[Campo]

        # si el valor antiguo no es un hash, elimínelo
        a no ser que Picadillo === valor_antiguo
          valor_antiguo = {}
        end

        # descender al hash, creando claves intermedias según sea necesario
        valor actual = valor_antiguo
        mientras secuencia_de_campo.longitud > 1
          cur_key = secuencia_de_campo.cambio
          # golpe en cada nivel si el tipo no es un hash
          a no ser que Picadillo === valor actual[cur_key]
            valor actual[cur_key] = {}
          end
          valor actual = valor actual[cur_key]
        end

        # ahora estamos en el nivel de hoja, realizamos el conjunto
        # y sobrescribir todo lo que había en este nivel antes
        valor actual[secuencia_de_campo.cambio] = valor

        # y establezca el valor en el valor del campo de nivel superior
        # porque esto es lo que pasamos a $set
        valor = valor_antiguo
      end

      atributo_de_proceso(Campo, valor)

      a no ser que relaciones.¿incluir?(Campo.a_s)
        ops[nombre_del_atributo_atómico(Campo)] = atributos[Campo]
      end
    end
    { "$set" => ops } a no ser que ops.¿vacío?
  end
end