Docs Menu
Docs Home
/ /

Atributos anidados

En esta guía, aprenderá a definir atributos anidados en modelos para habilitar operaciones de datos en documentos y sus asociaciones. Tras definir un atributo anidado, puede especificar actualizaciones para documentos de nivel superior y asociados en un único hash de parámetro. Esto puede ser útil si su aplicación requiere editar varios documentos en un solo formulario.

Puede habilitar atributos anidados para cualquier asociación, ya sea incrustada o referenciada. Para agregar un atributo anidado a una asociación, proporcione el nombre de la asociación a la accepts_nested_attributes_for macro al definir una clase de modelo.

El siguiente código define asociaciones integradas en la clase de modelo Band e incluye la macro accepts_nested_attributes_for:

class Band
include Mongoid::Document
embeds_many :albums
belongs_to :producer
accepts_nested_attributes_for :albums, :producer
end

Nota

Guardado automático habilitado

Cuando agrega la funcionalidad de atributo anidado a una asociación referenciada, Mongoid habilita automáticamente el guardado automático para esa asociación.

Al habilitar el comportamiento de atributos anidados en una asociación, Mongoid agrega un método especial al modelo base. Puede usar este método para actualizar los atributos.

El nombre del método es el nombre de la asociación con el sufijo _attributes. Por ejemplo, el método setter para actualizar la asociación producers es producer_attributes.

Puede usar este método directamente o usar su nombre como atributo en las actualizaciones de la clase de nivel superior. En este caso, Mongoid llama internamente al método setter correspondiente.

El siguiente código recupera una instancia de Band y luego utiliza el método de actualización de atributo anidado producer_attributes para establecer un valor para el documento de asociación:

# Retrieves a Band instance
band = Band.where(name: 'Tennis').first
# Updates the "producer" association
band.producer_attributes = { name: 'Alaina Moore' }

Hay varias formas de actualizar un atributo anidado:

  • Utilice el método setter <association name>_attributes.

  • Utilice el método setter attributes y especifique <association name>_attributes en el valor para actualizar las asociaciones.

  • Utilice el método setter update_attributes y especifique los nombres de los atributos en el valor para actualizar las asociaciones.

  • Utilice el método update y especifique <association name>_attributes en el valor para actualizar las asociaciones.

  • Utiliza el método create y especifica <association name>_attributes en el valor para crear las asociaciones.

El siguiente ejemplo demuestra cómo crear una instancia Band con registros album asociados en una sola declaración:

band = Band.create(
name: 'Tennis',
albums_attributes: [
{ name: 'Swimmer', year: 2020 },
{ name: 'Young & Old', year: 2013 }]
)

Puede crear nuevos documentos anidados mediante la función de atributos anidados. Al crear un documento, omita el campo _id. El siguiente código utiliza el método update para crear un documento album anidado en una instancia Band existente:

band = Band.where(name: 'Vampire Weekend').first
band.update(albums_attributes: [
{ name: 'Contra', year: 2010 }
])

Esta acción agrega el nuevo documento al conjunto existente sin cambiar ningún documento anidado existente.

Puede actualizar documentos anidados existentes mediante la función de atributos anidados. Para indicar a Mongoid que actualice un documento anidado mediante atributos, pase el valor _id del documento al método update. El siguiente ejemplo utiliza el valor _id de una entrada albums para actualizar el campo year:

band = Band.where(name: 'Vampire Weekend').first
# Retrieves the first entry from the albums array
album = band.albums.first
# Updates the entry by passing the _id value
band.update(albums_attributes: [
{ _id: album._id, year: 2011 } ])

Importante

No hay documento coincidente

Si Mongoid no coincide con un documento que tiene el valor _id especificado, genera una excepción Mongoid::Errors::DocumentNotFound.

Puede eliminar documentos anidados especificando el atributo _destroy en el método update. Para habilitar la eliminación de documentos anidados, debe establecer allow_destroy: true en la declaración accepts_nested_attributes_for, como se muestra en el siguiente código:

class Band
# ...
accepts_nested_attributes_for :albums, allow_destroy: true
end

El siguiente código utiliza el atributo _destroy para eliminar la primera entrada albums de una instancia Band:

band = Band.where(name: 'Vampire Weekend').first
# Retrieves the first entry from the albums array
album = band.albums.first
# Deletes the entry by passing the _id value
band.update(albums_attributes: [
{ _id: album._id, _destroy: true } ])

Importante

No hay documento coincidente

Si Mongoid no coincide con un documento que tiene el valor _id especificado, genera una excepción Mongoid::Errors::DocumentNotFound.

Puede realizar múltiples operaciones de datos en documentos anidados utilizando la función de atributos anidados.

El siguiente código crea un documento anidado, actualiza un documento existente y elimina un documento en la matriz albums de una instancia Band:

band = Band.where(name: 'Yeah Yeah Yeahs').first
# Performs multiple data changes
band.update(albums_attributes: [
{ name: 'Show Your Bones', year: 2006 },
{ _id: 1, name: 'Fever To T3ll' },
{ _id: 2, _destroy: true } ])

Para obtener más información sobre las consultas, consulte la Especifique una guía de consulta de documentos.

Para obtener más información sobre cómo realizar operaciones CRUD, consulta la guía Realiza operaciones de datos.

Para obtener más información sobre las asociaciones, consulte la guía de Asociaciones.

Volver

Transacciones y Sesiones

En esta página