Módulo: Mongoid::Copiable

Ampliado por:
ActiveSupport::Concern
Incluido en:
Compuesto
Definido en:
lib/mongoid/copyable.rb

Overview

Este módulo contiene el comportamiento de clonación / duplicación de document de Mongoid.

Resumen del método de clase colapsar

Resumen del método de instancia colapsar

Detalles del método de clase

.clone_with_hash(klass, attrs) ⇒ Document

Crea un clon de un document de la clase dada con el hash de atributos dado. Esto se utiliza de forma recursiva para que las asociaciones incorporadas se clonen de forma segura.

Parámetros:

  • klass (clase)

    La clase del document a crear.

  • attrs (encriptada)

    El hash de los atributos.

Devuelve:



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# Archivo 'lib/mongoid/copyable.rb', línea 42

def sí mismo.clone_with_hash(klass, attrs)
  dynamic_attrs = {}
  _attribute_names = klass.attribute_names
  attrs.¡rechazar! hacer |attr_name, Valor|
    a menos que _attribute_names.incluir?(attr_name)
      dynamic_attrs[attr_name] = Valor
      true
    end
  end

  Fábrica.compilar(klass, attrs).tocar hacer |Objeto|
    dynamic_attrs.cada hacer |attr_name, Valor|
      assoc = Objeto.embedded_relations[attr_name]
      si assoc&.¿uno? && Valor.is_a?(encriptada)
        Objeto.enviar("#{attr_name}=", clone_with_hash(assoc.klass, Valor))
      elsif assoc&.¿muchos? && Valor.is_a?(Arreglo)
        docs = Valor.map { |h| clone_with_hash(assoc.klass, h) }
        Objeto.enviar("#{attr_name}=", docs)
      elsif Objeto.respond_to?("#{attr_name}=")
        Objeto.enviar("#{attr_name}=", Valor)
      else
        Objeto.atributos[attr_name] = Valor
      end
    end
  end
end

Detalles del método de instancia

#cloneDocumento También conocido como: duplicar

Clona o duplica el Document actual. Esto devolverá todos los atributos con la excepción del ID del document, y restablecerá todas las variables de instancia.

Este clon también incluye documentos incrustados. Si hay un campo _id en el documento incrustado, se mantendrá, a diferencia del _id de la raíz.

Si se clona un hijo embebido, el padre embebido no se clona y la asociación embedded_in no se configura.

Ejemplos:

Clonar el documento.

document.clone

Devuelve:



22
23
24
25
26
27
28
29
# Archivo 'lib/mongoid/copyable.rb', línea 22

def clonar
  # @note Esta siguiente línea se encuentra aquí para abordar #2704, aunque tener un
  # El campo _id y id en el documento causarían problemas con Mongoid
  # en otro lugar. Tenga en cuenta que esto solo se realiza en el documento raíz, como queremos
  # para mantener el mismo _id en los documentos incrustados.
  attrs = clonar_documento.excepto(*sí mismo.clase.id_fields)
  Copiable.clone_with_hash(sí mismo.clase, attrs)
end