Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
176 lines
7.2 KiB
Plaintext
176 lines
7.2 KiB
Plaintext
---
|
|
title: Crear relaciones de muchos a muchos
|
|
description: Conecta registros en los que muchos elementos en ambos lados pueden vincularse entre sí mediante objetos de unión.
|
|
---
|
|
|
|
Las relaciones de muchos a muchos te permiten conectar varios registros en ambos lados. Por ejemplo: muchas personas pueden trabajar en muchos proyectos, y cada proyecto puede tener muchas personas.
|
|
|
|
<Warning>
|
|
**Función beta**: Las relaciones de unión están actualmente en beta. Actívalas en **Settings → Community → Features** antes de seguir esta guía.
|
|
</Warning>
|
|
|
|
<Note>
|
|
Esta función también requiere que **Advanced mode** esté activado (interruptor en la esquina inferior izquierda de Settings).
|
|
</Note>
|
|
|
|
## Cuándo usar relaciones de muchos a muchos
|
|
|
|
Usa relaciones de muchos a muchos cuando ambos lados de una relación pueden tener varias conexiones:
|
|
|
|
| Relación | Ejemplo |
|
|
| ----------------- | ---------------------------------------------------------------------------------------- |
|
|
| People ↔ Projects | Una persona trabaja en varios proyectos; un proyecto tiene varios miembros del equipo |
|
|
| Companies ↔ Tags | Una empresa puede tener varias etiquetas; una etiqueta puede aplicarse a varias empresas |
|
|
| Products ↔ Orders | Un producto puede estar en varios pedidos; un pedido contiene varios productos |
|
|
|
|
## Cómo Funciona
|
|
|
|
Twenty utiliza un patrón de **objeto de unión** para las relaciones de muchos a muchos. Un objeto de unión se sitúa entre dos objetos y contiene las conexiones:
|
|
|
|
```
|
|
People ←→ Project Assignments ←→ Projects
|
|
```
|
|
|
|
El objeto **Project Assignments** (unión) tiene:
|
|
|
|
* Una relación con People (muchos a uno)
|
|
* Una relación con Projects (muchos a uno)
|
|
|
|
Cuando activas el interruptor de relación de unión, Twenty muestra los registros vinculados directamente en lugar de mostrar los registros intermedios de unión.
|
|
|
|
## Prerrequisitos
|
|
|
|
1. **Habilita Junction Relations en Beta Features**: Ve a **Settings → Community → Features** y habilita **Junction Relations**
|
|
2. **Activa Advanced mode**: Activa **Advanced mode** en la parte inferior izquierda de la barra lateral de Settings
|
|
3. Planifica tu modelo de datos:
|
|
* ¿Qué dos objetos estás conectando?
|
|
* ¿Cómo debería llamarse el objeto de unión?
|
|
|
|
## Paso 1: Crear el objeto de unión
|
|
|
|
Primero, crea el objeto intermedio que contendrá las conexiones.
|
|
|
|
1. Vaya a **Configuración → Modelo de datos**
|
|
2. Haga clic en **+ Añadir objeto**
|
|
3. Asígnale un nombre descriptivo (p. ej., "Project Assignment", "Team Member", "Product Order")
|
|
4. Activa "Omitir la creación de un campo Nombre"
|
|
|
|
<img src="/images/user-guide/fields/new-pivot-object.png" alt="Nuevo objeto de unión" />
|
|
|
|
5. Haga clic en **Guardar**
|
|
|
|
<Tip>
|
|
**Convención de nombres**: Usa un nombre que describa la relación, como "Project Assignment" o "Team Membership". Esto hace que el modelo de datos sea más fácil de entender.
|
|
</Tip>
|
|
|
|
## Paso 2: Crea relaciones entre los objetos y el objeto de unión
|
|
|
|
Agrega campos de relación desde cada uno de tus dos objetos al objeto de unión.
|
|
|
|
### Primera relación (Objeto A → Unión)
|
|
|
|
1. Selecciona tu primer objeto en **Settings → Data Model**
|
|
2. Haz clic en **+ Add Relation**
|
|
3. Selecciona el objeto de unión (p. ej., "Project Assignments")
|
|
4. Configura el tipo de relación como **One-To-Many** (una persona puede vincularse a muchas asignaciones)
|
|
5. Nombra los campos:
|
|
* Campo en People: p. ej., "Project Assignments"
|
|
* Campo en unión: p. ej., "Person"
|
|
6. Haga clic en **Guardar**
|
|
|
|
### Segunda relación (Objeto B → Unión)
|
|
|
|
1. Selecciona tu segundo objeto en **Settings → Data Model**
|
|
2. Haz clic en **+ Add Relation**
|
|
3. Selecciona el objeto de unión (p. ej., "Project Assignments")
|
|
4. Configura el tipo de relación como **One-To-Many** (un proyecto puede vincularse a muchas asignaciones)
|
|
5. Activa **"This is a relation to a Junction Object"**
|
|
|
|
<img src="/images/user-guide/fields/junction-relation-toggle.png" style={{width:'100%'}} />
|
|
|
|
6. Nombra los campos:
|
|
* Campo en unión: p. ej., "Project"
|
|
* Campo en Projects: p. ej., "Team Members"
|
|
7. Haga clic en **Guardar**
|
|
|
|
## Paso 3: Configurar la visualización de la relación de unión
|
|
|
|
Ahora configura los objetos de origen para mostrar los registros vinculados directamente, omitiendo el objeto de unión intermedio.
|
|
|
|
1. Vaya a **Configuración → Modelo de datos**
|
|
2. Selecciona el primer objeto (p. ej., "People")
|
|
3. Encuentra el campo de relación que apunta al objeto de unión (p. ej., "Project Assignments")
|
|
4. Haz clic para editar el campo
|
|
5. Activa **"This is a relation to a Junction Object"**
|
|
6. Selecciona la **Target relation** (p. ej., "Project" — el campo en la unión que apunta al otro lado)
|
|
7. Haga clic en **Guardar**
|
|
|
|
## Resultado
|
|
|
|
Después de la configuración:
|
|
|
|
* En un registro de **Person**, el campo "Project Assignments" muestra **Projects** directamente (no registros de asignación)
|
|
* En un registro de **Project**, el campo "Team Members" muestra **People** directamente
|
|
|
|
El objeto de unión sigue existiendo y almacena las conexiones, pero la interfaz presenta una vista de muchos a muchos más limpia.
|
|
|
|
## Ejemplo: People ↔ Projects
|
|
|
|
Aquí tienes una guía completa paso a paso:
|
|
|
|
### Crear el objeto de unión
|
|
|
|
* Nombre: **Project Assignment**
|
|
* Descripción: "Vincula a las personas con los proyectos en los que trabajan"
|
|
|
|
### Agregar relaciones
|
|
|
|
1. **People → Project Assignment**
|
|
* Tipo: One-to-Many
|
|
* Campo en People: "Project Assignments"
|
|
* Campo en Assignment: "Person"
|
|
|
|
2. **Projects → Project Assignment**
|
|
* Tipo: One-to-Many
|
|
* Campo en Projects: "Team Members"
|
|
* Campo en Assignment: "Project"
|
|
|
|
### Configurar la visualización de la unión
|
|
|
|
1. En el objeto **People**:
|
|
* Edita el campo "Project Assignments"
|
|
* Activa el interruptor de unión
|
|
* Destino: "Project"
|
|
|
|
2. En el objeto **Projects**:
|
|
* Edita el campo "Team Members"
|
|
* Activa el interruptor de unión
|
|
* Destino: "Person"
|
|
|
|
### Úsalo
|
|
|
|
* Abre un registro de Person → Ve sus Projects directamente
|
|
* Abre un registro de Project → Ve los miembros del equipo directamente
|
|
* Crea nuevas conexiones desde cualquiera de los dos lados
|
|
|
|
## Agregar datos adicionales a las conexiones
|
|
|
|
Como el objeto de unión es un objeto real, puedes agregar campos personalizados para almacenar información sobre la relación:
|
|
|
|
* **Rol**: "Desarrollador", "Diseñador", "Gerente"
|
|
* **Fecha de inicio**: Cuando la persona se unió al proyecto
|
|
* **Horas asignadas**: Horas semanales en este proyecto
|
|
|
|
Para acceder a estos datos, navega directamente al objeto de unión o consúltalo mediante la API.
|
|
|
|
## Limitaciones
|
|
|
|
* **Importación/Exportación CSV**: No se admite importar relaciones de muchos a muchos directamente. En su lugar, importa registros al objeto de unión.
|
|
* **Filtros**: Filtrar por relaciones de muchos a muchos puede tener opciones limitadas.
|
|
|
|
## Relacionado
|
|
|
|
* [Campos de relación](/l/es/user-guide/data-model/capabilities/relation-fields) — tipos de relaciones explicados
|
|
* [Crear objetos personalizados](/l/es/user-guide/data-model/how-tos/create-custom-objects) — cómo crear objetos
|
|
* [Crear campos de relación](/l/es/user-guide/data-model/how-tos/create-relation-fields) — configuración básica de relaciones
|