Filtros dinámicos en restricciones de instancia
Cuando una propiedad hace referencia a una instancia de otro modelo (por ejemplo, una Order que apunta a un Customer), puedes aplicarle una restricción InstanceReferenceConstraint para limitar qué instancias se pueden seleccionar. Esta restricción tiene un campo Filter que puede contener un valor literal o, más potente, una referencia dinámica a otra propiedad de la misma instancia que se está editando.
Vocabulario
Tres conceptos a tener claros antes de continuar:
- Modelo contenedor — el modelo que contiene la propiedad restringida. Si pones la restricción en
Order.customer, el modelo contenedor esOrder. - Target Model — el modelo de las instancias que se pueden seleccionar. En el ejemplo,
Customer. - Property — la propiedad concreta restringida. En el ejemplo,
Order.customer.
Filtro estático vs dinámico
Un filtro estático compara una propiedad del Target Model con un valor literal:
Muestra solo los
Customerdonderegion == "Catalunya".
Un filtro dinámico compara una propiedad del Target Model con el valor de otra propiedad del modelo contenedor, valor que se resuelve en el momento de editar la instancia:
Muestra solo los
Customerdonderegion == $ref(Order.region).
Cuando abres Order #42 (región = Catalunya), el desplegable de customer mostrará únicamente clientes catalanes. Cuando abras Order #43 (región = Aragón), mostrará aragoneses. El filtro es el mismo; el valor referenciado cambia según la instancia que estás editando.
Cómo construir un filtro dinámico
- Crea o edita la
InstanceReferenceConstraint. - Elige el Model (contenedor) y la Property que quieres restringir.
- Elige el TargetModel.
- Abre el campo Filter con el botón de edición. Se abre el constructor de filtros sobre el TargetModel.
- Elige una propiedad del TargetModel y un operador (por ejemplo,
=). - Se abre el diálogo "Valor para X" con las opciones de qué valor usar.
El diálogo "Valor para X"
Cada vez que creas un filtro dentro de una restricción, el sistema te muestra este diálogo para que elijas de dónde sale el valor de la comparación:
- Propiedades del modelo contenedor del mismo tipo — aparecen como entradas clicables. Elegir una guarda una referencia dinámica (
$ref), que se resolverá en tiempo de edición. - Usar un valor estático — siempre disponible; permite introducir un literal.
- Si el modelo contenedor no tiene ninguna propiedad compatible, el diálogo lo indica explícitamente con un mensaje ("No hay ninguna propiedad compatible para referenciar") y solo puedes elegir la opción estática. Esto no es un error: simplemente no hay ningún campo adecuado para referenciar.
Para que una propiedad del modelo contenedor aparezca como opción de referencia, debe ser del mismo tipo que la propiedad del TargetModel que estás filtrando. Por ejemplo, filtrando una String del TargetModel, solo verás las Strings del modelo contenedor.
Tipos admitidos
Puedes filtrar y referenciar propiedades de estos tipos:
- String, Integer, Float, Decimal
- Boolean
- DateTime, Date
- ModelReference, InstanceReference, ModelPropertyReference
Las propiedades de tipo Colección no se pueden filtrar (ni con valores literales ni con referencias dinámicas).
Resolución en tiempo de ejecución
Cuando un usuario abre la instancia restringida, Yellow recorre los filtros y, para cada $ref, lee el valor actual de la propiedad referenciada en la instancia que se está editando y lo sustituye dentro del filtro. Si la propiedad referenciada está vacía, ese filtro concreto se omite — no se bloquea la selección, simplemente no se aplica esa condición.
Por eso un filtro dinámico es tan útil cuando quieres mantener relaciones consistentes entre instancias: puedes forzar que el Customer de una Order sea de la misma región que la Order, sin tener que duplicar el filtro para cada combinación posible de valores.