Módulo: Mongoid::Persistable::Settable
- Ampliado por:
- ActiveSupport::Concern
- Incluido en:
- Mongoid::Persistable
- Definido en:
- lib/mongoid/persistable/settable.rb
Overview
Define el comportamiento de las operaciones $set.
Resumen del método de instancia colapsar
-
#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.
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, su valor original se descarta y el campo se reemplaza con un hash.
Tenga en cuenta que, a diferencia del $set de MongoDB, el set de Mongoid escribe todo el campo incluso cuando se configura un subconjunto del campo a través de la semántica anidada de hash. Esto significa que realizar un $set con semántica de hash anidada puede sobrescribir otras claves hash dentro del campo de nivel superior en la base de datos.
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(asignadores) preparar_operación_atómica hacer |ops| proceso_operaciones_atómicas(asignadores) hacer |Campo, Valor| field_seq = Campo.to_s.división('.') Campo = field_seq.turno si field_seq.longitud > 0 # ruta de hash anidada valor_antiguo = atributos[Campo] # si el valor anterior no es un hash, sobrescribirlo a menos que Picadillo === valor_antiguo valor_antiguo = {} end # descender en la hash, creando claves intermedias según sea necesario cur_value = valor_antiguo mientras field_seq.longitud > 1 cur_key = field_seq.turno # sobrescribir en cada nivel si el tipo no es un hash a menos que Picadillo === cur_value[cur_key] cur_value[cur_key] = {} end cur_value = cur_value[cur_key] end # ahora estamos en el nivel hoja, realiza el set # y sobrescribe todo lo que había en este nivel antes cur_value[field_seq.turno] = 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 process_attribute(Campo, Valor) a menos que relaciones.incluir?(Campo.to_s) ops[atomic_attribute_name(Campo)] = atributos[Campo] end end { "$set" => ops } a menos que ops.¿vacío? end end |