Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

Utilizar atributos anidados

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.

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 attributes y especifica <association name>_attributes en el valor para actualizar las asociaciones.

  • Se debe utilizar el método setter update_attributes y especificar los nombres de los atributos en el valor para actualizar las asociaciones.

  • Usa el método update y especifica <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 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 }]
)

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.

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.

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.

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 } ])

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".

Volver

Herencia

En esta página