Relaciones

Una relación expresa la conexión potencial entre registros en modelos de Cloud SQL. Representa la capacidad de un registro de asociarse con uno o más registros. Por ejemplo, un modelo Person en una aplicación social podría tener una relación Friends que represente la amistad entre dos personas.

Conceptos básicos de las relaciones

Las relaciones en App Maker son bidireccionales. Cada dirección se denomina extremo de relación y cada extremo de relación tiene dos propiedades, que se detallan a continuación:

  • Nombre: el nombre del extremo de relación, que se usa para referirse a ella en la vinculación de datos y las secuencias de comandos.
  • Recuento: la cantidad de conexiones que admite el extremo de relación. El recuento se puede establecer en uno (lo que significa que el registro solo acepta una conexión) o varios, (lo que significa que el registro acepta una cantidad ilimitada de conexiones). Las relaciones pueden ser de tipo uno a uno, uno a varios y varios a varios. El valor de recuento a recuento se denomina cardinalidad o grado de la relación.

Por ejemplo, una app de RR. HH. puede usar las relaciones entre los modelos EmployeeDB y Teams para representar a los empleados y sus equipos. Puedes crear una relación de varios a varios entre EmployeeDB y Teams porque cada empleado puede ser parte de varios equipos. A continuación, se muestran las propiedades de los extremos de relación:

  • Nombre=Miembros, Recuento=Varios
  • Nombre=Equipos, Recuento=Varios

También puedes crear una relación de uno a varios entre EmployeeDB y Teams, porque cada equipo puede tener un gerente y cada gerente puede tener varios equipos. A continuación, se muestran las propiedades de los extremos de relación:

  • Nombre=Gerente, Recuento=Uno
  • Nombre=Equipos, Recuento=Varios

Crea y edita relaciones

Para crear una relación, sigue estos pasos:

  1. Haz clic en un modelo de Cloud SQL y dirígete a la pestaña Relaciones (Relations).
  2. Para crear una relación, haz clic en Agregar relación (Add Relation). Usa el asistente de creación para seguir estos pasos:

    1. Establece el modelo de destino para el otro extremo de relación.
    2. Selecciona el recuento para cada extremo de relación.
    3. (Opcional) Ingresa los nombres para cada extremo de relación si no deseas mantener los predeterminados.
    4. (Opcional) En el caso de las relaciones de uno a uno y uno a varios, selecciona Propietario (Owner) para un extremo de relación con un recuento de uno. Especifica un modelo Propietario en una relación solo si sucede lo siguiente:
  3. Haz clic en Crear (Create).

Después de crear una relación, puedes editar el nombre del extremo de relación. Para los extremos de relación con un recuento de uno, puedes habilitar o inhabilitar la propiedad. Para los extremos de relación con un recuento de varios, puedes cambiar el orden.

Para editar una relación, sigue estos pasos:

  1. Haz clic en un modelo y dirígete a la pestaña Relaciones (Relations) correspondiente.
  2. En la lista de relaciones, haz clic en el nombre del extremo de relación.

    Para las relaciones que conectan registros en dos modelos, la lista de relaciones de cada modelo solo muestra el nombre del extremo de relación del modelo opuesto. Para las relaciones que conectan registros en el mismo modelo, se enumeran ambos extremos de relación. En el ejemplo del modelo EmployeeDB, Manager y Members se enumeran en la pestaña Relaciones (Relations).

  3. Edita el nombre, el orden o el propietario. Tus cambios se guardan de forma automática.

    Si quieres configurar el orden, selecciona el campo que quieres usar para ordenar los registros. Selecciona la casilla de verificación Ascendente (Ascending) a fin de establecer el orden de los registros para el extremo de relación. Si no especificas un orden de preferencia, lo determinará el backend de datos del modelo.

Propiedad de registros asociados

Para las relaciones que tienen como mínimo un extremo de relación con un recuento de uno, puedes especificar un Propietario, sujeto a algunas reglas. Cuando estableces un propietario, creas una relación de propietario y propiedad para los registros asociados en los dos modelos:

  • Con propiedad: cuando una lógica de app o de usuario borra un registro del modelo de propietario, la app borra todos los registros de propiedad asociados. Cuando se borra un registro de propiedad, no se borran los registros de propietario.
  • Sin propiedad: cuando se borra un registro en algún extremo de la relación, no se borran los del otro extremo.

Especifica un modelo de propietario en una relación, solo si se cumplen las siguientes condiciones:

  • Los registros de propiedad no deben existir sin sus registros de propietario.
  • Deseas que los registros en el extremo de propiedad de la relación se borren de forma automática cuando se borra el registro de propietario.

Ejemplo de propiedad

Es posible que desees borrar elementos de la factura cuando se borre una. Con una relación de uno a varios entre el modelo Invoice y el modelo Item, establece Invoice como el propietario. Cuando un usuario borra un registro Invoice, la app también borra todos los registros Item de propiedad, que son los asociados con el registro Invoice que se borró.

Ten en cuenta que los registros borrados son instancias específicas de elementos, como unidades de disco específicas del inventario, y no categorías de elementos, como los tipos de unidades de disco que almacenas.

Reglas de propiedad

  • Solo el modelo de un lado de una relación de uno a uno o de uno a varios puede ser propietario.
  • No puedes designar un modelo como propietario si eso crearía un ciclo de propiedad, es decir, si los registros A y B se poseen mutuamente.
  • Puedes encadenar las relaciones de propietario y propiedad. Por ejemplo, si tienes los siguientes modelos y relaciones:

    • Modelos Forum, Topic y Comment
    • Una relación de uno a varios de Forum a Topic, con el modelo Forum como propietario
    • Una relación de uno a varios de Topic a Comment, con el modelo Topic como propietario

    Cuando borras un registro Topic, App Maker también borra todos los registros Comment asociados. Cuando borras un registro Forum, App Maker borra todos los registros Topic asociados y sus registros Comment asociados.

  • Un modelo con varias relaciones puede ser propiedad de muchos modelos Propietarios.

  • Cuando borras un registro de un modelo Propietario, App Maker borra de otros modelos los registros que este poseía, incluso si los registros también son propiedad de registros en otros modelos.

Administra asociaciones entre registros

Una asociación es el vínculo real entre dos registros a través de una relación de modelo. Por ejemplo, si tienes una relación de uno a varios entre los extremos de relación Manager y Teams, hay asociaciones entre el registro de Manager1 y los registros de cada equipo.

Según el flujo de trabajo de tu app, puedes crear y modificar asociaciones entre registros de las siguientes formas:

  1. Usa vinculaciones de datos con el fin de permitir que un widget muestre o cambie asociaciones para un registro.
  2. Usa una secuencia de comandos de cliente para manejar cambios de asociaciones más complicados que los que realiza la vinculación de datos.
  3. Usa una secuencia de comandos de servidor para manejar cambios masivos o hacer cambios de forma segura.

Modifica asociaciones con una vinculación de datos

Hay muchas formas de cambiar las asociaciones entre registros a través de vinculaciones de datos, pero la más simple es acceder a un extremo de relación como una propiedad de un item de fuente de datos de modelos. En las fuentes de datos de modelos, los extremos de relación se exponen como propiedades de registro, al igual que los campos.

Si quieres habilitar una visualización de widget o cambiar los registros asociados para el registro que está seleccionado, vincula el value del widget a @datasource.item.[relation end name]. Este método es útil especialmente para los widgets desplegables (cuando el extremo de relación tiene un recuento de uno) y los cuadros de selección múltiple (cuando el extremo de relación tiene un recuento de varios). Para obtener un ejemplo, consulta el instructivo Conecta modelos de datos. Cuando creas los elementos de la IU para enumerar a los empleados, debes configurar vinculaciones entre los valores de widget y las fuentes de datos.

Modifica asociaciones con una secuencia de comandos de cliente

Este enfoque es más difícil que las vinculaciones de datos, porque debes asegurarte de que la fuente de datos cargó los registros asociados con el registro. Puedes asegurarte de que los registros asociados se hayan cargado de las siguientes maneras:

  • Habilita la recuperación previa para la fuente de datos.
  • Llama a _loadRelation-name en el registro y espera una devolución de llamada asíncrona.
  • Espera el evento onLoad de una fuente de datos de relación.
  • Espera el evento onDataLoad de un widget que usa una fuente de datos de relación.

Por ejemplo, si quieres continuar con la situación de relación entre EmployeeDB y Team anterior, puedes usar el siguiente código para asociar registros (asigna un gerente a un miembro del equipo y, luego, agrega ese miembro del equipo al equipo del gerente). Para facilitar el acceso a los registros de empleados correctos, creaste dos fuentes de datos en el modelo EmployeeDB:

  1. Manager, que te permite seleccionar un gerente
  2. Member, que te permite seleccionar un miembro del equipo
    var managerRecord = app.datasources.Manager.item;
    var teamRecord = app.datasources.Teams.item;

    // Assign the manager to the team.
    teamRecord.Manager = managerRecord;

    // Changes are saved automatically if the datasource in auto-save mode

    // Add a team member to a Manager's team.
    // Note: Retrieve Members on the client before proceeding, such as by using prefetch option in datasource - datasources Team -> Members)
    var engineerRecord = app.datasources.TeamMember.item;
    teamRecord.Members.push(engineerRecord);

Modifica asociaciones con una secuencia de comandos del servidor

Es más fácil modificar asociaciones en las secuencias de comandos del servidor que en las del cliente, porque no tienes que preocuparte por cuándo se cargan los registros asociados. Accede al registro apropiado y, luego, usa sus propiedades de extremo de relación para asociar registros a través de la relación.

Por ejemplo, si quieres continuar con la situación de relación entre EmployeeDB y Team anterior, puedes agregar gerentes y miembros a equipos con la siguiente secuencia de comandos del servidor:

// Get the record for the Team to modify.
var teamRecord = app.models.Teams.getRecord("team1");

// Assign a manager to the Team.
var managerRecord = app.models.EmployeeDB.getRecord("manager1");
teamRecord.Manager = managerRecord;

// Note: The new association is not saved yet

// Assign a team member to the Team.
var engineerRecord = app.models.EmployeeDB.getRecord("engineer1");
teamRecord.Members.push(engineerRecord);

// Save both changes to the database.
app.saveRecords([teamRecord]);

Filtrado de relaciones

Para ordenar o filtrar los registros por un campo en un modelo de Cloud SQL relacionado, agrega los nombres de la relación seguidos de un nombre de campo. Por ejemplo, para filtrar una relación Mother por el campo Age de los registros relacionados, usa Mother.Age.

También puedes aplicar los filtros equals, notEquals, in y notIn en un registro asociado o clave de registro. Por ejemplo, para verificar que un gerente de gerente esté asignado de forma correcta, puedes filtrarlo por Manager.Manager._key._equals.

El filtrado de relaciones está disponible en vinculación de datos y secuencias de comandos del servidor.

Lecturas adicionales