Overview
En esta guía, puedes aprender cómo definir atributos anidados en los modelos para habilitar operaciones de datos en documentos y sus asociaciones. Después de definir un atributo anidado, puede especificar actualizaciones en documentos de nivel superior y asociados en un único hash de parámetros. Esto podría ser útil si tu aplicación requiere editar varios documentos en un solo formulario.
Comportamiento
Puedes habilitar atributos anidados para cualquier asociación, ya sea embebida o referenciada. Para agregar un atributo anidado para una asociación, brinde el nombre de la asociación a la accepts_nested_attributes_for macro al definir una clase de modelo.
El siguiente código define las asociaciones embebidas en la clase de modelo Band e incluye el macro accepts_nested_attributes_for:
class Band include Mongoid::Document embeds_many :albums belongs_to :producer accepts_nested_attributes_for :albums, :producer end
Nota
Autoguardado activado
Cuando agrega la funcionalidad de atributo anidado a una asociación referenciada, Mongoid habilita automáticamente el autoguardado para esa asociación.
Cuando activas el comportamiento de atributos anidados en una asociación, Mongoid añade un método especial al modelo base. Puede utilizar 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 puede usar el nombre del método como un atributo en las actualizaciones para la clase de nivel superior. En este caso, Mongoid llama al método setter apropiado internamente.
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:
Usa el método setter
<association name>_attributes.Utiliza el método setter
attributesy especifica<association name>_attributesen el valor para actualizar las asociaciones.Se debe utilizar el método setter
update_attributesy especificar los nombres de los atributos en el valor para actualizar las asociaciones.Usa el método
updatey especifica<association name>_attributesen el valor para actualizar las asociaciones.Utiliza el método
createy especifica<association name>_attributesen el valor para crear las asociaciones.
El siguiente ejemplo demuestra cómo crear una instancia de Band con registros asociados de album en una sola instrucción:
band = Band.create( name: 'Tennis', albums_attributes: [ { name: 'Swimmer', year: 2020 }, { name: 'Young & Old', year: 2013 }] )
Creando documentos anidados
Puedes crear nuevos documentos anidados utilizando la funcionalidad 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 añade el nuevo documento al conjunto existente sin cambiar ninguno de los documentos anidados existentes.
Actualización de Documentos Anidados
Puedes actualizar los documentos anidados existentes utilizando la funcionalidad de atributos anidados. Para indicar a Mongoid que debe actualizar un documento anidado utilizando atributos, pasa 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 tenga el valor especificado _id, genera una excepción Mongoid::Errors::DocumentNotFound.
Borrar Documentos Anidados
Puedes eliminar documentos anidados especificando el atributo _destroy en el método update. Para habilitar la eliminación de documentos anidados, debes configurar 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 borrar 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 tenga el valor especificado _id, genera una excepción Mongoid::Errors::DocumentNotFound.
Combinar operaciones en documentos anidados
Puedes realizar múltiples operaciones de datos en documentos anidados utilizando la funcionalidad de atributos anidados.
El siguiente código crea un documento anidado, actualiza un documento existente y borra un documento en el arreglo 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 } ])
Información Adicional
Para obtener más información sobre las consultas, consulte la Especifica una query de documento guía.
Para obtener más información sobre cómo realizar operaciones CRUD, consulte la guía de operaciones CRUD.
Para obtener más información sobre las asociaciones, consulte la guía "Uso de asociaciones de datos".