Enumeraciones
Una enumeración es una lista cerrada de valores con nombre que reutilizas en todo el sistema. Piensa en estados ("Borrador", "Publicado", "Archivado"), prioridades ("Baja", "Normal", "Alta"), o cualquier vocabulario corto que tenga que verse igual allá donde aparezca.
Yellow modela las enumeraciones del mismo modo que modela todo lo demás: como instancias. Una Enumeration es una instancia de Yellow normal, igual que cada uno de sus EnumerationItem. Eso te da gratis toda la maquinaria de edición, versionado y referencia — y hace que una enumeración se comporte como cualquier otro dato del sistema.
El modelo Enumeration
Una Enumeration tiene tres propiedades:
| Propiedad | Tipo | Qué hace |
|---|---|---|
Name |
String | Nombre visible de la enumeración. |
Items |
Colección de referencias a EnumerationItem |
Lista ordenada de los valores que pertenecen a esta enumeración. |
OrderItemsByName |
Boolean | Cuando es verdadero, los items se ordenan por nombre; si no, por id. |
La colección Items es la fuente de verdad de la pertenencia. Los nuevos items se crean en línea desde el diálogo de la colección y se guardan en el mismo batch que la enumeración padre.
El modelo EnumerationItem
Un EnumerationItem tiene tres propiedades:
| Propiedad | Tipo | Qué hace |
|---|---|---|
Name |
String | La etiqueta que ve el usuario. |
Description |
String | Descripción libre. |
Id |
Integer | Identificador numérico estable dentro de la enumeración. |
El Id solo importa cuando una propiedad antigua aún espera un valor numérico (mira Propiedad Integer ligada a una enumeración más abajo). Para propiedades nuevas, trátalo como una clave de ordenación.
Dónde aparecen las enumeraciones en las restricciones
Hay tres formas de restricción que se anclan en una enumeración. Se diferencian en qué se guarda en la propiedad cuando el usuario elige un item.
1. Propiedad Integer ligada a una enumeración
Cuando la propiedad subyacente es un Integer, defines una restricción de entero con el campo Enumeration apuntando a la enumeración. El editor muestra un desplegable con los items de la enumeración, y el valor que se guarda en la propiedad es el Id (un número) del item elegido.
- Tipo de propiedad:
Integer - Restricción: restricción de entero con
Enumeration = "Estado" - Qué se guarda: el
Id(un número) del item elegido
Es la forma antigua. Funciona, pero arrastra una trampa sutil: la propiedad por defecto vale 0, y si 0 es un Id válido en la enumeración, el desplegable parece seleccionado aunque nadie haya elegido nada. La mayoría de las veces conviene usar la forma siguiente.
2. Propiedad Instance Reference ligada a una enumeración
Cuando la propiedad subyacente es una Instance Reference, defines una restricción de referencia a instancia con dos campos:
Target Model = EnumerationItemEnumeration = "Estado"
El editor muestra el mismo desplegable, pero el valor guardado es una referencia al EnumerationItem elegido. "Nada elegido" y "una selección real" son ya inequívocos.
- Tipo de propiedad:
Instance Reference - Restricción: restricción de referencia a instancia con
Target Model = EnumerationItemyEnumeration = "Estado" - Qué se guarda: una referencia al
EnumerationItemelegido
Es la forma recomendada para propiedades nuevas.
3. Colección de items tipados vía una enumeración
En una restricción de colección, el campo Item Type es en sí mismo una referencia a un item de la enumeración integrada Property Types. Elegir "STRING" significa "cada entrada de la colección debe ser un string"; elegir "INSTANCE_REFERENCE" significa "cada entrada debe apuntar a una instancia" y entonces también defines Target Model. Mismo patrón que arriba, aplicado recursivamente a la restricción que define la propia colección.
Enumeraciones integradas
Yellow viene con un pequeño conjunto de enumeraciones de sistema. La que más a menudo encontrarás es Property Types — lista todos los tipos de propiedad que Yellow soporta (String, Integer, Boolean, Float, Decimal, DateTime, Date, Model Reference, Model Property Reference, Instance Reference, Instance Property Reference, Collection). Es lo que alimenta el selector de tipos en el editor de restricciones de colección.
Evolución: entero → item de enumeración → modelo personalizado
Las propiedades tienden a crecer. Un campo que empieza como una marca numérica a menudo pasa a ser una enumeración, y una enumeración a menudo acaba siendo un modelo completo cuando los items necesitan campos más ricos (una categoría deja de ser solo una etiqueta — también tiene un icono, una categoría padre, un slug, etc.). Las formas de restricción anteriores están diseñadas para que esos saltos sean baratos.
De Integer a EnumerationItem
Tienes una propiedad Integer ligada a una enumeración. Quieres evolucionarla para que el valor lleve la identidad completa del item elegido (y dejar atrás la trampa del 0 por defecto).
- Cambia el tipo de la propiedad de
IntegeraInstance Reference. - Sustituye la restricción de entero por una restricción de referencia a instancia sobre la misma propiedad, con
Target Model = EnumerationItemy la mismaEnumeration. - Migra los datos existentes: para cada valor entero guardado, busca el
EnumerationItemcorrespondiente y sustituye el entero por una referencia a ese item.
El desplegable se sigue viendo igual desde la perspectiva del usuario.
De EnumerationItem a un modelo personalizado
Imagina que tu enumeración se ha quedado corta. "Estado" antes era solo un nombre; ahora necesitas guardar un icono, un color, una posición en un workflow y unos cuantos permisos. Es hora de promocionarlo a un modelo dedicado — digamos, Status.
Este salto es casi gratis porque el tipo subyacente de la propiedad no cambia — sigue siendo una Instance Reference:
- Define el nuevo modelo (
Status) y copia cadaEnumerationItema una instancia deStatus. Preservar el identificador de cada item hace que la migración sea zero-touch. - Actualiza la restricción: mantén la restricción de referencia a instancia sobre la propiedad, deja de lado el campo
Enumeration, y cambiaTarget ModeldeEnumerationItemaStatus.
Los datos existentes ya guardan una referencia — solo cambió la forma del destino. Si has conservado los mismos identificadores, las referencias existentes siguen siendo válidas; si has usado nuevos, haz una pasada one-shot para remapearlas.
Esta es la ventaja de construir toda enumeración sobre referencias: una enumeración es el modelo personalizado más sencillo posible. Cuando se te queda pequeña, promocionas sin reescribir cómo se guarda la propiedad.
Cómo editar enumeraciones
Las enumeraciones viven en el Explorador como cualquier otra instancia. Abre el modelo Enumeration, escoge o crea una enumeración, y edita su colección Items — los nuevos items se crean en línea (el formulario de EnumerationItem se integra directamente en el diálogo de la colección) y se guardan en el mismo batch que la enumeración padre. Reordena ajustando el Id de cada item, o activa OrderItemsByName para ordenar por etiqueta.