inheritance - Cómo agregar restricciones a las propiedades heredadas en una subclase de dominio de grails
constraints subclass (4)
Esto es lo que me gustaría hacer:
class A {
String string
static constraints = {
string(maxSize:100)
}
}
class B extends A {
static constraints = {
string(url:true)
}
}
Por lo tanto, la clase A debería tener algunas restricciones y B debería tener las mismas restricciones adicionales más en la misma propiedad.
Sin embargo, no pude hacerlo funcionar y puedo imaginar que chocaría con el concepto Tabla por jerarquía.
Así que traté de evitar ese problema introduciendo un objeto Command con restricciones de clase B que pueden ser validadas en el constructor de clase B. Sin embargo, parece que los objetos Command solo pueden usarse dentro de los controladores (Grails sigue diciendo que no hay .validate) () método para ello).
Entonces mi pregunta es: ¿Cuál es la manera más elegante de resolver esto usando las restricciones de Grails (no reimplementando la validación manualmente)? Podría ser...
- ¿Cambiar al concepto de tabla por subclase?
- Hacer que el Objeto de Comando trabaje en la clase de Dominio de alguna manera?
- ¿Cualquier otra manera?
Editar: estaría bien para mí definir todas las restricciones en las clases secundarias, repetir las restricciones de la clase padre o incluso no tener restricciones en la clase padre en absoluto. Pero la solución debería funcionar para múltiples clases secundarias (con diferentes restricciones) de la misma clase principal.
Básicamente, no veo cómo se puede hacer.
En cuanto al diseño, una clase de dominio en realidad mapea la estructura de la tabla de la base de datos. Las restricciones generarán realmente restricciones de DB. Entonces, estás intentando crear varios objetos que generarán diferentes restricciones en la misma tabla.
Creo que el mejor enfoque sería crear un objeto de dominio que tenga el subconjunto más simple de restricciones y luego usar diferentes objetos de comando para ajustar con precisión las restricciones exactas que desea pasar al dominio.
También puede usar el validador: en las restricciones para ajustar con precisión diferentes restricciones para diferentes tipos de objetos (algo así como una columna de tipos en el dominio y basada en diferentes tipos de validación diferente).
Como estaba en 2.x:
Como las restricciones son un cierre ejecutado por algunos ConstraintsBuilder, trataría de llamarlo desde B, como
class B extends A {
static constraints = {
url(unique: true)
A.constraints.delegate = delegate # thanks Artefacto
A.constraints()
}
}
Necesita redeclarar las restricciones de superclase porque es un dispositivo estático (las clases estáticas no heredan las propiedades estáticas y los métodos estáticos), por lo tanto, GORM no lo correlaciona.
Aclamaciones.
Puedes usar
class B extends A {
static constraints = {
importFrom A
//B stuff
}
}
como estados en http://grails.org/doc/latest/ref/Constraints/Usage.html