Docs Menu
Docs Home
/ /

Asociaciones

Las asociaciones en Mongoid permiten crear relaciones entre modelos. En esta guía, aprenderá sobre los diferentes tipos de asociaciones que Mongoid admite y cómo usarlas en su aplicación.

Las asociaciones referenciadas permiten crear una relación entre dos modelos, donde uno hace referencia al otro. Mongoid admite los siguientes tipos de asociaciones referenciadas:

  • has_one

  • has_many

  • belongs_to

  • has_and_belongs_to_many

Las siguientes secciones describen cómo utilizar cada uno de estos tipos de asociación.

Puede usar la macro has_one para declarar que los documentos representados por una clase también contienen un documento representado por una clase secundaria independiente. El siguiente ejemplo crea una clase Band con una relación has_one con una clase Studio:

class Band
include Mongoid::Document
has_one :studio
end

Al declarar una asociación has_one, la clase hija también debe usar la asociación belongs_to que hace referencia a la clase padre. El siguiente ejemplo muestra la clase Studio referenciada en la clase Band anterior:

class Studio
include Mongoid::Document
belongs_to :band
end

Para obtener más información sobre la macro belongs_to, consulte la Pertenece a la sección.

Puede utilizar validaciones para garantizar que la clase secundaria esté presente en su clase principal, como se muestra en el siguiente ejemplo:

class Band
include Mongoid::Document
has_one :studio
validates_presence_of :studio
end

Para obtener más información sobre las validaciones en Mongoid, consulte la Guía de validaciones.

Puede usar la macro has_many para declarar que los documentos representados por una clase contienen varios documentos secundarios representados por otra clase. El siguiente ejemplo crea una clase Band con una relación has_many con una clase Members:

class Band
include Mongoid::Document
has_many :members
end

Al declarar una asociación has_many, la clase hija también debe usar la asociación belongs_to que hace referencia a la clase padre. El siguiente ejemplo muestra la clase Member referenciada en la clase Band anterior:

class Member
include Mongoid::Document
belongs_to :band
end

Para obtener más información sobre la belongs_to macro, consulte la sección Pertenece a.

Puede utilizar validaciones para garantizar que la clase secundaria esté presente en su clase principal, como se muestra en el siguiente ejemplo:

class Band
include Mongoid::Document
has_many :members
validates_presence_of :members
end

Para obtener más información sobre las validaciones en Mongoid, consulte la guía de Validaciones.

Puede utilizar el método any? en una asociación has_many para determinar si la asociación contiene algún documento sin recuperar el conjunto completo de documentos de la base de datos.

El siguiente ejemplo utiliza el método any? para determinar si los documentos de la clase Band contienen algún documento Members:

band = Band.first
band.members.any?

También puede utilizar el método any? con un filtro para buscar documentos que coincidan con un criterio específico, como se muestra en el siguiente ejemplo:

band = Band.first
band.members.any? { |member| member.instrument == 'piano' }

Puede proporcionar un nombre de clase al método any? para filtrar los resultados por el nombre de la clase. Esto es útil para asociaciones polimórficas:

class Drummer < Member
end
band = Band.first
band.members.any?(Drummer)

Nota

Una vez cargados los datos de la clase asociada en Mongoid, las llamadas posteriores al método any? no consultan la base de datos. En su lugar, Mongoid utiliza los datos ya cargados en memoria.

También puede llamar al método exists? para determinar si hay algún documento persistente en la asociación. El método exists? siempre consulta la base de datos y solo verifica los documentos que han sido guardados en la base de datos. El método exists? no permite filtrar ni acepta ningún argumento.

El siguiente ejemplo utiliza el método exists? para determinar si hay documentos Members persistentes en la clase Band:

band = Band.create!
# Member is not persisted.
band.members.build
band.members.exists?
# Outputs: false
# Persist the member
band.members.map(&:save!)
band.members.exists?
# Outputs: true

Utilice la macro belongs_to para declarar que un documento representado por una clase es hijo de un documento representado por otra clase. De forma predeterminada, el campo _id de la clase padre se almacena en la clase hija. El siguiente ejemplo crea una clase Members con una asociación belongs_to a una clase Band:

class Members
include Mongoid::Document
belongs_to :band
end

Puede permitir que Mongoid persista documentos en la base de datos sin almacenar el _id de la clase padre asociada configurando la opción optional en true, como se muestra en el siguiente ejemplo:

class Members
include Mongoid::Document
belongs_to :band, optional: true
end

Tip

Puede cambiar globalmente el comportamiento predeterminado de la asociación belongs_to para no requerir su clase principal estableciendo la opción de configuración belongs_to_required_by_default en false en la configuración de su aplicación.

Puede especificar una asociación belongs_to en una clase secundaria sin especificar una asociación has_one o has_many coincidente en la clase principal. Al hacerlo, no podrá acceder a los campos del documento secundario desde la clase principal, pero sí podrá acceder a los campos principales almacenados en la clase secundaria, como el campo _id de la clase principal. En el siguiente ejemplo, la clase Band no puede acceder a la clase Members, pero la clase Members sí puede acceder a la clase Band:

class Band
include Mongoid::Document
end
class Members
include Mongoid::Document
belongs_to :band
end

Para mayor claridad, de manera opcional, puedes establecer la opción inverse_of en nil para indicar que la clase padre no contiene una asociación has_one o has_many con la clase hija, como se muestra en el siguiente ejemplo:

class Band
include Mongoid::Document
end
class Members
include Mongoid::Document
belongs_to :band, inverse_of: nil
end

Utilice la macro has_and_belongs_to_many para declarar que un modelo de clase contiene una relación de varios a varios con otra clase. En una relación de varios a varios, cada documento de una clase puede asociarse con varios documentos de otra clase. El siguiente ejemplo crea una clase Band con una relación has_and_belongs_to_many con una clase Members. Un documento Band puede hacer referencia a varios documentos Members, y un documento Members puede hacer referencia a varios documentos Band.

class Band
include Mongoid::Document
has_and_belongs_to_many :members
end
class Members
include Mongoid::Document
has_and_belongs_to_many :bands
end

Al declarar una asociación has_and_belongs_to_many, ambas instancias del modelo almacenan una lista de los valores _id del documento asociado. Puede configurar la opción inverse_of como nil para almacenar los valores _id del documento asociado solo en una de las instancias del modelo. El siguiente ejemplo solicita a Mongoid que almacene los valores _id del documento asociado solo en la clase Band:

class Band
include Mongoid::Document
has_and_belongs_to_many :tags, inverse_of: nil
end
class Tag
include Mongoid::Document
end

Tip

Cuando actualiza un documento que tiene una asociación has_and_belongs_to_many, Mongoid establece el campo updated_at del documento actualizado, pero no establece el campo updated_at de los documentos asociados.

Puede usar una canalización de agregación para consultar documentos en asociaciones referenciadas. Esta canalización le permite crear consultas en múltiples colecciones y manipular datos en un formato específico. Para obtener más información sobre el uso de la canalización de agregación, consulte la guía de agregación.

Para consultas sencillas, puede consultar la asociación directamente. Al consultar directamente una colección, solo puede consultar los campos y valores que se encuentran en ella. No puede consultar directamente las colecciones asociadas a la que está consultando.

Por ejemplo, consideremos las siguientes clases Band y Tour:

class Band
include Mongoid::Document
has_many :tours
field :name, type: String
end
class Tour
include Mongoid::Document
belongs_to :band
field :year, type: Integer
end

El siguiente ejemplo consulta la clase Tour para encontrar documentos con un valor year igual o superior a 2000 y guarda el band_id de esos documentos. A continuación, consulta la clase Band para encontrar documentos con esos valores band_id.

band_ids = Tour.where(year: {'$gte' => 2000}).pluck(:band_id)
bands = Band.find(band_ids)

Puede usar asociaciones integradas para almacenar diferentes tipos de documentos en la misma colección. Mongoid admite asociaciones integradas con las siguientes macros:

  • embeds_one

  • embeds_many

  • embedded_in

  • recursively_embeds_one

  • recursively_embeds_many

Las siguientes secciones describen cómo utilizar estos tipos de asociación.

Para especificar que un modelo de clase contiene un documento incrustado de un tipo de clase diferente, utilice la macro embeds_one en la clase principal y la macro embedded_in en la clase incrustada. El siguiente ejemplo crea una clase Band con una clase Label incrustada:

class Band
include Mongoid::Document
embeds_one :label
end
class Label
include Mongoid::Document
field :name, type: String
embedded_in :band
end

Mongoid almacena los documentos incrustados con la macro embeds_one en el documento principal como un campo con el mismo nombre que la clase incrustada. Los documentos Label anteriores se almacenan en el documento Band, como se muestra en el siguiente ejemplo:

# Band document
{
"_id" : ObjectId("..."),
"label" : {
"_id" : ObjectId("..."),
"name" : "Periphery",
}
}

Puede almacenar el documento incrustado con un nombre diferente utilizando la opción store_as, como se muestra en el siguiente ejemplo:

class Band
include Mongoid::Document
embeds_one :label, store_as: "record_label"
end

Para especificar que un modelo de clase contiene varios documentos incrustados de un tipo de clase diferente, utilice la macro embeds_many en la clase principal y la macro embedded_in en la clase incrustada. El siguiente ejemplo crea una clase Band con varios documentos incrustados de tipo Album:

class Band
include Mongoid::Document
embeds_many :albums
end
class Album
include Mongoid::Document
field :name, type: String
embedded_in :band
end

Mongoid almacena los documentos incrustados con la macro embeds_many en el documento principal como un campo de matriz con el mismo nombre que la clase incrustada. Los documentos Album anteriores se almacenan en el documento Band, como se muestra en el siguiente ejemplo:

{
"_id" : ObjectId("..."),
"albums" : [
{
"_id" : ObjectId("..."),
"name" : "Omega",
}
]
}

Puede almacenar el documento incrustado con un nombre diferente utilizando la opción store_as, como se muestra en el siguiente ejemplo:

class Band
include Mongoid::Document
embeds_many :albums, store_as: "records"
end

Puede incrustar uno o más documentos del mismo tipo en una clase principal mediante las macros recursively_embeds_one y recursively_embeds_many. Ambas macros proporcionan accesores para los documentos principal y secundario mediante un método parent_* y un método child_*, donde * representa el nombre de la clase. El siguiente ejemplo crea una clase Band que incrusta recursivamente varios documentos Band para representar varios nombres de banda:

class Band
include Mongoid::Document
field :name, type: String
recursively_embeds_many
end

Puede acceder a los documentos padre e hijo a través de los métodos parent_band y child_band, como se muestra en el siguiente ejemplo:

root = Band.new(name: "Linkin Park")
# Add child bands
child_one = root.child_band.build(name: "Lincoln Park")
child_two = root.child_band.build(name: "Xero")
# Access parent band
child_one.parent_band
# Outputs: root

Puede acceder a documentos incrustados al consultar la colección de la clase principal mediante la notación de puntos.

El siguiente ejemplo utiliza la notación de puntos para consultar documentos de tipo Tour incrustados en una clase Band. La consulta devuelve documentos con un valor tours.year igual o superior a 2000:

Band.where('tours.year' => {'$gte' => 2000})

Puede utilizar el método de proyección pluck para recuperar documentos incrustados sin recuperar sus documentos principales asociados, como se muestra en el siguiente ejemplo:

# Get awards for bands that have toured since 2000
Band.where('tours.year' => {'$gte' => 2000}).pluck(:awards)

Puede usar los métodos de consulta de Mongoid para realizar coincidencias integradas, lo que le permite consultar asociaciones integradas de documentos ya cargados en la aplicación. Mongoid implementa la coincidencia integrada sin enviar consultas al servidor.

Los siguientes operadores de consulta son compatibles con coincidencia integrada:

El siguiente ejemplo consulta el campo tours incrustado de un documento Band cargado utilizando el operador de comparación $gte:

band = Band.where(name: 'Astral Projection').first
tours = band.tours.where(year: {'$gte' => 2000})

La coincidencia integrada en documentos cargados tiene las siguientes limitaciones conocidas:

  • La coincidencia integrada no está implementada para las siguientes funciones:

  • Mongoid expande los argumentos Range a hashes con condiciones $gte y $lte. Esto puede generar consultas no válidas en algunos casos y generar una excepción InvalidQuery.

  • Con el operador $regex, no se puede especificar un objeto de expresión regular como patrón y, al mismo tiempo, proporcionar opciones al campo $options. Solo se pueden proporcionar opciones si el patrón de expresión regular es una cadena.

Por defecto, Mongoid añade un campo _id a los documentos incrustados. Se puede omitir este campo de los documentos incrustados mediante la especificación explícita del campo _id en el modelo y la omisión del valor por defecto. El siguiente ejemplo ordena a Mongoid no agregar un campo _id a la clase Albums:

class Album
include Mongoid::Document
field :name, type: String
field :_id, type: Object
embedded_in :band
end

En la clase Albums anterior, el campo _id no se agrega automáticamente. Sin un valor predeterminado, Mongoid no almacena el valor en la base de datos a menos que se proporcione uno en el modelo.

Puede eliminar documentos secundarios de las asociaciones embeds_many mediante uno de los siguientes métodos:

  • clear

  • delete_all

  • destroy_all

El clear método utiliza el operador $unset para eliminar una asociación incrustada completa del documento principal. El clear método no ejecuta ninguna destroy devolución de llamada. El siguiente ejemplo utiliza el clear método para eliminar todas las asociaciones incrustadas de la Band clase:

band = Band.find(...)
band.tours.clear

El delete_all método utiliza el operador $pullAll para eliminar documentos de una asociación incrustada. delete_all carga la asociación si aún no se ha cargado y, a continuación, elimina únicamente los documentos existentes en la aplicación. El delete_all método no ejecuta ninguna destroy devolución de llamada. El siguiente ejemplo utiliza el delete_all método para eliminar todos los Album documentos incrustados de la Band clase:

band = Band.find(...)
band.tours.delete_all

El destroy_all método también utiliza el operador $pullAll para eliminar documentos de una asociación incrustada. Además, ejecuta cualquier destroy devolución de llamada definida en los documentos asociados. El siguiente ejemplo utiliza el destroy_all método para eliminar todos los Album documentos incrustados de la Band clase:

band = Band.find(...)
band.tours.destroy_all

Puede usar Mongoid para personalizar el comportamiento de las asociaciones en su aplicación. Las siguientes secciones describen cómo personalizar el comportamiento de las asociaciones.

Las extensiones permiten añadir funcionalidades personalizadas a una asociación. Se puede definir una extensión en una asociación especificando un bloque en la definición de la asociación, como se muestra en el siguiente ejemplo:

class Band
include Mongoid::Document
embeds_many :albums do
def find_by_name(name)
where(name: name).first
end
end
end
band.albums.find_by_name("Omega") # returns album "Omega"

Puede usar la macro class_name para especificar un nombre de clase personalizado para una asociación. Esto resulta útil si desea asignar a la asociación un nombre distinto del de la clase. El siguiente ejemplo usa la macro class_name para especificar que una asociación incrustada llamada records representa la clase Album:

class Band
include Mongoid::Document
embeds_many :records, class_name: "Album"
end

De forma predeterminada, Mongoid utiliza el campo _id de la clase padre al buscar asociaciones. Puede especificar diferentes campos mediante las macros primary_key y foreign_key. El siguiente ejemplo especifica una nueva clave principal y una clave externa para la asociación albums en una clase Band:

class Band
include Mongoid::Document
field :band_id, type: String
has_many :albums, primary_key: 'band_id', foreign_key: 'band_id_ref'
end
class Album
include Mongoid::Document
field :band_id_ref, type: String
belongs_to :band, primary_key: 'band_id', foreign_key: 'band_id_ref'
end

Si especifica una asociación has_and_belongs_to_many, también puede usar las macros inverse_primary_key y inverse_foreign_key. La macro inverse_primary_key especifica el campo del modelo local que el modelo remoto utiliza para buscar los documentos. La macro inverse_foreign_key especifica el campo del modelo remoto que almacena los valores encontrados en inverse_primary_key.

El siguiente ejemplo especifica una nueva clave principal y externa para las clases Band y Members en una asociación has_and_belongs_to_many:

class Band
include Mongoid::Document
field :band_id, type: String
field :member_ids, type: Array
has_many :members,
primary_key: 'member_id', foreign_key: 'member_ids',
inverse_primary_key: 'band_id', inverse_foreign_key: 'band_ids'
end
class Member
include Mongoid::Document
field :member_id, type: String
field :band_ids, type: Array
has_many :bands,
primary_key: 'band_id', foreign_key: 'band_ids',
inverse_primary_key: 'member_id', inverse_foreign_key: 'member_ids'
end

Puede especificar el alcance de una asociación usando el parámetro scope. El parámetro scope determina los documentos que Mongoid considera parte de una asociación. Una asociación con alcance devuelve solo los documentos que cumplen las condiciones de alcance cuando se consultan. Puede establecer el scope en un Proc con una aridad de cero o en un Symbol que haga referencia a un alcance nombrado en el modelo asociado. El siguiente ejemplo establece ámbitos personalizados en las asociaciones de una clase Band:

class Band
include Mongoid::Document
has_many :albums, scope: -> { where(published: true) }
# Uses a scope called "upcoming" on the Tour model
has_many :tours, scope: :upcoming
end

Nota

Puede agregar documentos que no cumplan las condiciones de alcance a una asociación. Mongoid guarda los documentos en la base de datos y aparecerán en la memoria asociada. Sin embargo, no los verá al consultar la asociación.

Cuando Mongoid carga una asociación en memoria, utiliza la macro validates_associated de forma predeterminada para validar la presencia de sus hijos. Mongoid valida los hijos para los siguientes tipos de asociación:

  • embeds_many

  • embeds_one

  • has_many

  • has_one

  • has_and_belongs_to_many

Puede desactivar este comportamiento de validación configurando la macro validate en false al definir la asociación, como se muestra en el siguiente ejemplo:

class Band
include Mongoid::Document
embeds_many :albums, validate: false
end

Mongoid admite polimorfismo en las clases hijas de asociaciones uno a uno y uno a muchos. Las asociaciones polimórficas permiten que una sola asociación contenga objetos de diferentes tipos de clase. Se puede definir una asociación polimórfica estableciendo la opción polymorphic en true en una asociación hija y añadiendo la opción as a la asociación padre. El siguiente ejemplo crea una asociación polimórfica en una clase Band:

class Tour
include Mongoid::Document
has_one :band, as: :featured
end
class Label
include Mongoid::Document
has_one :band, as: :featured
end
class Band
include Mongoid::Document
belongs_to :featured, polymorphic: true
end

En el ejemplo anterior, la asociación :featured en la clase Band puede contener un documento Label o Album.

Importante

Mongoid solo admite polimorfismo de hijo a padre. No se puede especificar una asociación de padre has_one o has_many como polimórfica.

has_and_belongs_to_many Las asociaciones no admiten polimorfismo.

A partir de la versión 9.0.2, Mongoid admite tipos polimórficos personalizados mediante un registro global. Puede especificar claves alternativas para representar diferentes clases, desvinculando así su código de los datos. El siguiente ejemplo especifica la cadena "artist" como clave alternativa para la clase Band:

class Band
include Mongoid::Document
identify_as 'artist'
has_many :albums, as: :record
end

En el ejemplo anterior, la directiva identify_as indica a Mongoid que almacene la clase Band en la base de datos como la cadena "artist".

También puede especificar varios alias, como se muestra en el siguiente ejemplo:

class Band
include Mongoid::Document
identify_as 'artist', 'group', 'troupe'
has_many :albums, as: :record
end

En el ejemplo anterior, artist es el nombre predeterminado y los demás se usan solo para buscar registros. Esto permite refactorizar el código sin romper las asociaciones de los datos.

Los alias de tipo polimórfico son globales. Las claves que especifique deben ser únicas en todo el código base. Sin embargo, puede registrar resolvers alternativos que se puedan usar para diferentes subconjuntos de sus modelos. En este caso, las claves deben ser únicas solo para cada resolver. El siguiente ejemplo muestra cómo registrar resolvers alternativos:

Mongoid::ModelResolver.register_resolver Mongoid::ModelResolver.new, :mus
Mongoid::ModelResolver.register_resolver Mongoid::ModelResolver.new, :tool
module Music
class Band
include Mongoid::Document
identify_as 'bnd', resolver: :mus
end
end
module Tools
class Band
include Mongoid::Document
identify_as 'bnd', resolver: :tool
end
end

Tanto Music::Band como Tools::Band tienen el alias "bnd", pero cada modelo utiliza su propio solucionador para evitar conflictos.

Puede proporcionar opciones dependent a las asociaciones referenciadas para especificar cómo Mongoid gestiona los documentos asociados al eliminar un documento. Puede especificar las siguientes opciones:

  • delete_all:Elimina todos los documentos secundarios sin ejecutar ninguna devolución de llamada de modelo.

  • destroy:Elimina los documentos secundarios y ejecuta todas las devoluciones de llamadas del modelo.

  • nullify: Establece la clave externa de los documentos secundarios en nil. El documento secundario podría quedar huérfano si solo el documento principal hace referencia a él.

  • restrict_with_exception: Genera una excepción si el documento secundario no está vacío.

  • restrict_with_error:Cancela la operación y devuelve false si el documento secundario no está vacío.

Si no especifica ninguna opción dependent, Mongoid deja el documento secundario sin cambios al eliminar el documento principal. El documento secundario sigue haciendo referencia al documento principal eliminado, y si solo se hace referencia a través del principal, queda huérfano.

El siguiente ejemplo especifica dependent opciones en la clase Band:

class Band
include Mongoid::Document
has_many :albums, dependent: :delete_all
belongs_to :label, dependent: :nullify
end

De forma predeterminada, Mongoid no guarda automáticamente los documentos asociados de asociaciones no incrustadas al guardar el documento principal. Esto puede generar referencias colgantes a documentos inexistentes.

Puede usar la opción autosave en una asociación referenciada para guardar automáticamente los documentos asociados al guardar el documento principal. El siguiente ejemplo crea una clase Band con una clase Album asociada y especifica la opción autosave:

class Band
include Mongoid::Document
has_many :albums
end
class Album
include Mongoid::Document
belongs_to :band, autosave: true
end
band = Band.new
album = Album.create!(band: band)
# The band is persisted at this point.

Nota

Mongoid agrega automáticamente la funcionalidad de guardado automático a una asociación que utiliza la opción accepts_nested_attributes_for.

No se necesita especificar la opción autosave para asociaciones incrustadas porque Mongoid guarda los documentos incrustados en el documento principal.

Puede agregar la opción autobuild a asociaciones uno a uno, como has_one y embeds_one, para instanciar automáticamente un nuevo documento al acceder a una asociación nil. El siguiente ejemplo agrega la opción autobuild a una asociación en la clase Band:

class Band
include Mongoid::Document
embeds_one :label, autobuild: true
has_one :producer, autobuild: true
end

Cuando Mongoid accede a un documento, actualiza su updated_at campo con la fecha y hora actuales. Puede añadir la touch opción a cualquier belongs_to asociación para garantizar que Mongoid acceda al documento principal siempre que se actualice el documento secundario. El siguiente ejemplo añade la touch opción a una asociación en la Band clase:

class Band
include Mongoid::Document
field :name
belongs_to :label, touch: true
end

También puede usar la opción touch para especificar otro campo en la asociación principal, como una cadena o un símbolo. Al acceder a la asociación principal, Mongoid establece tanto el campo updated_at como el campo especificado con la fecha y hora actuales.

El siguiente ejemplo le indica a Mongoid que toque el campo bands_updated_at:

class Band
include Mongoid::Document
belongs_to :label, touch: :bands_updated_at
end

Nota

En las asociaciones incrustadas, al acceder a un documento incrustado, Mongoid accede a sus padres recursivamente. Por ello, no es necesario añadir un atributo touch a una asociación embedded_in.

Mongoid no admite la especificación de campos adicionales para tocar en asociaciones embedded_in.

Puede usar la opción counter_cache para almacenar el número de objetos que pertenecen a un campo asociado. Al especificar esta opción, Mongoid almacena un atributo adicional en los modelos asociados para almacenar el recuento. Por ello, debe especificar el módulo Mongoid::Attributes::Dynamic en las clases asociadas.

El siguiente ejemplo agrega la opción counter_cache a una clase Band y especifica Mongoid::Attributes::Dynamic en una clase Label:

class Band
include Mongoid::Document
belongs_to :label, counter_cache: true
end
class Label
include Mongoid::Document
include Mongoid::Attributes::Dynamic
has_many :bands
end

Cuando defines una asociación, Mongoid almacena metadatos sobre esa asociación. Puedes acceder a los metadatos llamando al método reflect_on_association en una clase de modelo o documento, o accediendo directamente a los metadatos en un documento específico. El siguiente ejemplo muestra cómo acceder a los metadatos utilizando el método reflect_on_association y por acceso directo:

# Get the metadata for a named association from the class or document
Model.reflect_on_association(:<association_name>)
# Directly access metadata on a document
model.associations[:<association_name>]

Nota

Reemplace <association_name> en el ejemplo anterior con el nombre de su asociación.

Todas las asociaciones contienen atributos que almacenan información sobre el documento asociado. Las asociaciones contienen los siguientes atributos:

  • _target:El documento o documentos proxy

  • _base:El documento en el que se define la asociación

  • _association:Información sobre la asociación

El siguiente ejemplo accede a cada uno de los atributos anteriores:

class Band
include Mongoid::Document
embeds_many :songs
end
Band.songs = [ song ]
Band.songs._target # returns [ song ]
Band.songs._base # returns band
Band.songs._association # returns the association metadata

La siguiente tabla muestra la información almacenada en el atributo _association:

Método
Descripción

Association#as

El nombre del padre de un hijo polimórfico.

Association#as?

Devuelve si existe una opción as.

Association#autobuilding?

Devuelve si la asociación se está construyendo automáticamente.

Association#autosaving?

Devuelve si la asociación se guarda automáticamente.

Association#cascading_callbacks?

Devuelve si la asociación tiene devoluciones de llamadas en cascada desde el padre.

Association#class_name

El nombre de la clase del documento proxy.

Association#cyclic?

Devuelve si la asociación es una asociación cíclica.

Association#dependent

La opción dependiente de la asociación.

Association#destructive?

Devuelve true si la asociación tiene un método de eliminación o destrucción dependiente.

Association#embedded?

Devuelve si la asociación está incrustada en otro documento.

Association#forced_nil_inverse?

Devuelve si la asociación tiene una inversa nil definida.

Association#foreign_key

El nombre del campo de clave externa.

Association#foreign_key_check

El nombre del método de verificación sucia del campo de clave externa.

Association#foreign_key_setter

El nombre del establecedor del campo de clave externa.

Association#indexed?

Devuelve si la clave externa está indexada automáticamente.

Association#inverses

Los nombres de todas las asociaciones inversas.

Association#inverse

El nombre de una única asociación inversa.

Association#inverse_class_name

El nombre de la clase de la asociación en el lado inverso.

Association#inverse_foreign_key

El nombre del campo de clave externa en el lado inverso.

Association#inverse_klass

La clase de la asociación en el lado inverso.

Association#inverse_association

Los metadatos de la asociación en el lado inverso.

Association#inverse_of

El nombre definido explícitamente de la asociación inversa.

Association#inverse_setter

El nombre del método utilizado para establecer la inversa.

Association#inverse_type

El nombre del campo de tipo polimórfico de la inversa.

Association#inverse_type_setter

El nombre del establecedor del campo de tipo polimórfico de la inversa.

Association#key

El nombre del campo en el hash del atributo que se utiliza para obtener la asociación.

Association#klass

La clase de los documentos proxy en la asociación.

Association#name

El nombre de la asociación.

Association#options

Devuelve self, para compatibilidad de API con ActiveRecord.

Association#order

Las opciones de clasificación personalizadas en la asociación.

Association#polymorphic?

Devuelve si la asociación es polimórfica.

Association#setter

El nombre del campo donde se establecerá la asociación.

Association#store_as

El nombre del atributo en el que se almacenará una asociación incorporada.

Association#touchable?

Devuelve si la asociación tiene una opción táctil.

Association#type

El nombre del campo para obtener el tipo polimórfico.

Association#type_setter

El nombre del campo para establecer el tipo polimórfico.

Association#validate?

Devuelve si la asociación tiene una validación asociada.

Volver

Devoluciones de llamada