Módulo: Mongoid::Association::Accesores

Ampliado por:
ActiveSupport::Concern
Incluido en:
Mongoid::Association
Definido en:
lib/mongoid/association/accessors.rb

Overview

Este módulo contiene todo el comportamiento relacionado con el acceso a las asociaciones mediante los métodos getter y setter, además de cómo delegar a los desarrolladores la creación de nuevas instancias.

Resumen del método de clase colapsar

Resumen del método de instancia colapsar

Detalles del método de clase

.define_builder!(asociación) ⇒ Clase

Define un método de constructor para una asociación embeds_one. Esto se define como #build_name.

Ejemplos:

Person.define_builder!(association)

Parámetros:

Devuelve:

  • (clase)

    La clase se está configurando.



387
388
389
390
391
392
393
394
395
396
397
398
399
400
# Archivo 'lib/mongoid/association/accessors.rb', línea 387

def sí mismo.define_builder!(asociación)
  Nombre = asociación.Nombre
  asociación.clase_inversa.tocar hacer |klass|
    klass.re_define_method("build_#{nombre}") hacer |*args|
      atributos, _opciones = parse_args(*args)
      Documento = Fábrica.compilar(asociación.relation_class, atributos)
      _edificio hacer
        niño = enviar("#{name}=", Documento)
        niño.run_callbacks(compilar)
        niño
      end
    end
  end
end

.define_creator!(association) ⇒ Class

Define un método de creación para una asociación embeds_one. Esto se define como #create_name. Después de que se compile el objeto, este se guardará inmediatamente.

Ejemplos:

Person.define_creator!(association)

Parámetros:

Devuelve:

  • (clase)

    La clase se está configurando.



412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
# Archivo 'lib/mongoid/association/accessors.rb', línea 412

def sí mismo.define_creator!(asociación)
  Nombre = asociación.Nombre
  asociación.clase_inversa.tocar hacer |klass|
    klass.re_define_method("crear_#{nombre}") hacer |*args|
      atributos, _opciones = parse_args(*args)
      Documento = Fábrica.compilar(asociación.klass, atributos)
      doc = asignando hacer
        enviar("#{name}=", Documento)
      end
      doc.guardar
      guardar si nuevo_registro? && asociación.¿stores_foreign_key?
      doc
    end
  end
end

.define_existence_check!(association) ⇒ Class

Añade la comprobación de existencia para las asociaciones.

Ejemplos:

Agrega la verificación de existencia.

Person.define_existence_check!(association)

Verifica si existe una asociación.

person = Person.new
person.has_game?
person.game?

Parámetros:

Devuelve:

  • (clase)

    El model se está configurando.



277
278
279
280
281
282
283
284
285
286
287
# Archivo 'lib/mongoid/association/accessors.rb', línea 277

def sí mismo.definir_comprobación_de_existencia!(asociación)
  Nombre = asociación.Nombre
  asociación.clase_inversa.tocar hacer |klass|
    klass.module_eval <<-END, __FILE__, __LINE__ + 1
        def #{Nombre}?
          without_autobuild { !__send__(:#{Nombre}).empty? }
        end
        alias :has_#{Nombre}? :#{Nombre}?
    END
  end
end

.define_getter!(association) ⇒ Clase

Define el getter para la asociación. Nada demasiado especial aquí: solo devuelve la variable de instancia de la asociación si existe o compila el objeto.

Ejemplos:

Configure el getter para la asociación.

Person.define_getter!(association)

Parámetros:

Devuelve:

  • (clase)

    La clase se está configurando.



299
300
301
302
303
304
305
306
307
308
# Archivo 'lib/mongoid/association/accessors.rb', línea 299

def sí mismo.define_getter!(asociación)
  Nombre = asociación.Nombre
  asociación.clase_inversa.tocar hacer |klass|
    klass.re_define_method(Nombre) hacer |recargar = false|
      Valor = get_relation(Nombre, asociación, nulo, recargar)
      Valor = enviar("build_#{nombre}") si Valor.nil? && asociación.¿autoconstruyendo? && !without_autobuild?
      Valor
    end
  end
end

.define_ids_getter!(association) ⇒ Clase

Define el captador para los IDs de document en la asociación. Debe especificarse solo para las asociaciones de referencias múltiples.

Ejemplos:

Configura el getter de ids para la asociación.

Person.define_ids_getter!(association)

Parámetros:

Devuelve:

  • (clase)

    La clase se está configurando.



319
320
321
322
323
324
325
326
# Archivo 'lib/mongoid/association/accessors.rb', línea 319

def sí mismo.define_ids_getter!(asociación)
  ids_method = "#{association.name.to_s.singularize}_ids"
  asociación.clase_inversa.tocar hacer |klass|
    klass.re_define_method(ids_method) hacer
      enviar(asociación.Nombre).pluck(::_id)
    end
  end
end

.define_ids_setter!(association) ⇒ Objeto

Define el método setter que le permite establecer document en esta asociación mediante sus identificaciones. El setter definido encuentra documentos con los IDs dados e invoca el setter de asociación regular con los documentos encontrados. Los definidores de IDs deben definirse solo para asociaciones múltiples referenciadas.

@param [ Mongoid::Association::Relatable ] association La asociación para la relación.

@return [ Clase ] La clase que se está configurando.

Ejemplos:

Configura el id_setter para la asociación.

Person.define_ids_setter!(association)


368
369
370
371
372
373
374
375
376
# Archivo 'lib/mongoid/association/accessors.rb', línea 368

def sí mismo.define_ids_setter!(asociación)
  ids_method = "#{association.name.to_s.singularize}_ids="
  asociación.clase_inversa.asociaciones_aliased[ids_method.picar] = asociación.Nombre.to_s
  asociación.clase_inversa.tocar hacer |klass|
    klass.re_define_method(ids_method) hacer |identificadores|
      enviar(asociación.setter, asociación.relation_class.buscar(identificadores.rechazar(&:blank?)))
    end
  end
end

.define_setter!(association) ⇒ Clase

Define el setter para la asociación. Esto hace algunas cosas según ciertas condiciones. Si existe una asociación, se realizará una sustitución de destino; de lo contrario, se creará una nueva asociación con el destino proporcionado.

Ejemplos:

Configura el setter para la asociación.

Person.define_setter!(association)

Parámetros:

Devuelve:

  • (clase)

    La clase se está configurando.



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# Archivo 'lib/mongoid/association/accessors.rb', línea 339

def sí mismo.define_setter!(asociación)
  Nombre = asociación.Nombre
  asociación.clase_inversa.tocar hacer |klass|
    klass.re_define_method("#{name}=") hacer |Objeto|
      without_autobuild hacer
        si Valor = get_relation(Nombre, asociación, Objeto)
          Valor = compilar(Nombre, Valor, asociación) a menos que Valor.respond_to?(sustituto)

          establecer_relación(Nombre, Valor.sustituir(Objeto.sustituible))
        else
          compilar(Nombre, Objeto.sustituible, asociación)
        end
      end
    end
  end
end

Detalles del método de instancia

#__build__(nombre, objeto, asociación, campos_seleccionados = nil) ⇒ Proxy

Compila el documento relacionado y crea la asociación a menos que el documento sea nulo, entonces establece la asociación en este documento.

Ejemplos:

Compile la asociación.

person.__build__(:addresses, { :_id => 1 }, association)

Parámetros:

  • Nombre (String | Símbolo)

    El nombre de la asociación.

  • Objeto (Hash | BSON::ObjectId)

    El id o los atributos que se deben usar.

  • asociación (Mongoid::Association::Relatable)

    Los metadatos de la asociación.

  • selected_fields (encriptada) (valor por defecto: nil)

    Campos que fueron recuperados mediante #only. Si se especifica selected_fields, los campos que no estén listados en él no serán accesibles en el documento compilado.

Devuelve:

  • (Proxy)

    La asociación.



25
26
27
28
# Archivo 'lib/mongoid/association/accessors.rb', línea 25

def compilar(Nombre, Objeto, asociación, selected_fields = nulo)
  relación = crear_relación(Objeto, asociación, selected_fields)
  establecer_relación(Nombre, relación)
end

#create_relation(objeto, association, selected_fields = nil) ⇒ Proxy

Cree una asociación a partir de un objeto y metadatos de asociación.

Ejemplos:

Crea la asociación.

person.create_relation(document, association)

Parámetros:

  • Objeto (Document | Array<Document>)

    El objetivo de la asociación.

  • asociación (Mongoid::Association::Relatable)

    Los metadatos de la asociación.

  • selected_fields (encriptada) (valor por defecto: nil)

    Campos que se recuperaron a través de #only. Si se especifica selected_fields, los campos que no estén listados en él no serán accesibles en el documento de asociación creado.

Devuelve:

  • (Proxy)

    La asociación.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# Archivo 'lib/mongoid/association/accessors.rb', línea 42

def crear_relación(Objeto, asociación, selected_fields = nulo)
  llave = @atributos[asociación.inverse_type]
  tipo = llave ? asociación.resolver.modelo_para(llave) : nulo
  Objetivo = si t = asociación.compilar(sí mismo, Objeto, tipo, selected_fields)
             asociación.crear_relación(sí mismo, t)
           end

  # Solo es necesario hacer esto en asociaciones embebidas. Las funciones de retorno pendientes
  # sólo se añaden al materializar los documentos, lo que sólo ocurre
  # sobre asociaciones integradas. No hay ninguna llamada a la base de datos en el
  # construcción de una asociación referenciada.
  si asociación.¿Incorporado?
    Arreglo(Objetivo).cada hacer |doc|
      doc.intentar(:run_pending_callbacks)
    end
  end

  Objetivo
end

#reset_relation_criteria(nombre) ⇒ Objeto

Restablece los criterios dentro del proxy de asociación. Utilizado por asociaciones de muchos-a-muchos para mantener sincronizado el arreglo de IDs subyacente.

Ejemplos:

Restablecer los criterios de asociación.

person.reset_relation_criteria(:preferences)

Parámetros:

  • Nombre (Símbolo)

    El nombre de la asociación.



69
70
71
72
73
# Archivo 'lib/mongoid/association/accessors.rb', línea 69

def reset_relation_criteria(Nombre)
  return a menos que instance_variable_defined?("@_#{name}")

  enviar(Nombre).restablecer_descargado
end

#set_relation(nombre, relación) ⇒ Proxy

Establezca la asociación suministrada en una variable de instancia de la clase con el nombre proporcionado. Se utiliza como asistente solo para la limpieza del código.

Ejemplos:

Configura el proxy en el documento.

person.set(:addresses, addresses)

Parámetros:

  • Nombre (String | Símbolo)

    El nombre de la asociación.

  • relación (Proxy)

    La asociación a configurar.

Devuelve:

  • (Proxy)

    La asociación.



85
86
87
# Archivo 'lib/mongoid/association/accessors.rb', línea 85

def establecer_relación(Nombre, relación)
  instance_variable_set("@_#{name}", relación)
end