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 = EnumerationItem
  • Enumeration = "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 = EnumerationItem y Enumeration = "Estado"
  • Qué se guarda: una referencia al EnumerationItem elegido

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

  1. Cambia el tipo de la propiedad de Integer a Instance Reference.
  2. Sustituye la restricción de entero por una restricción de referencia a instancia sobre la misma propiedad, con Target Model = EnumerationItem y la misma Enumeration.
  3. Migra los datos existentes: para cada valor entero guardado, busca el EnumerationItem correspondiente 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:

  1. Define el nuevo modelo (Status) y copia cada EnumerationItem a una instancia de Status. Preservar el identificador de cada item hace que la migración sea zero-touch.
  2. Actualiza la restricción: mantén la restricción de referencia a instancia sobre la propiedad, deja de lado el campo Enumeration, y cambia Target Model de EnumerationItem a Status.

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.