2010-10-14 6 views
22

Aquí es lo que me gusta hacer:¿Cómo añadir restricciones sobre las propiedades heredadas en un dominio griales subclase

class A { 
    String string 
    static constraints = { 
    string(maxSize:100) 
    } 
} 

class B extends A { 
    static constraints = { 
    string(url:true) 
    } 
} 

Así clase A debe tener algunos limitaciones y B deben tener los mismos más restricciones adicionales en la misma propiedad.

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 validarse en el constructor de clase B. Sin embargo, parece que los objetos Command solo pueden usarse dentro de los controladores (Grails sigue diciendo que hay no es el método .validate() para él).

Así que 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 ...

  • Pasar al concepto de Tabla por subclase?
  • ¿El Objeto de Comando funciona de alguna manera en la clase de Dominio?
  • ¿Alguna otra forma?

Editar: que estaría bien para mí definir todas las restricciones en las clases hijas, repitiendo las limitaciones de la clase padre o ni siquiera tienen limitaciones 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.

+0

No estoy seguro de que cada restricción va a funcionar de esta manera, ya que por defecto hereditario clases se asignan a una misma mesa DB. Así que si tiene la clase C con restricciones únicas no nulas en C.c, impondrá la restricción de la tabla DB en toda la tabla A - y el campo c estará allí para todas las clases, y será nulo para todo menos para las instancias C. –

+0

Sí, es por eso que traje Table-per-Sub-Class en juego. –

Respuesta

5

La forma en que estaba en 2.x:

Como limitaciones es un cierre ejecutado por alguna ConstraintsBuilder, que iba a tratar llamándolo desde B, como

class B extends A { 
    static constraints = { 
    url(unique: true) 
    A.constraints.delegate = delegate # thanks Artefacto 
    A.constraints() 
    } 
} 
+1

Cerrar. Sin embargo, primero debe cambiar el delegado de 'A.constraints':' A.constraints.delegate = delegate'. Pero gracias por apuntarme en la dirección correcta. – Artefacto

+2

@Artefacto - ¿Sería capaz de publicar una respuesta que funciona o editar esta respuesta para que funcione? Sé de otros que han tenido esta pregunta. ¡Gracias! – cdeszaq

+0

lo he probado con grails 2.0.4 (con la consola de Grails) y no funciona, arroja un error en una fase donde A.contraints no tiene la propiedad de delegado – jneira

1

Básicamente no veo cómo se puede hacer.

Diseño inteligente 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 las restricciones exactas que desea pasar al dominio.

También podría utilizar el validador: en las restricciones para ajustar las diferentes restricciones para diferentes tipos de objetos (algo así como una columna de tipos en el dominio y en función de los diferentes tipos de validación diferente).

-1

Necesita redeclarar las restricciones de la superclase porque es un clojure estático (las clases estáticas no heredan las propiedades estáticas y los métodos estáticos), por lo tanto, no está mapeado por GORM.

Saludos.

Cuestiones relacionadas