2011-11-06 23 views
7

Estoy muy cerca de una solución, pero todo sigue mal, espero obtener ayuda, gracias de antemano.grails composite "restricción única", pero ¿cómo?

que tienen un modelo de dominio del cliente como:

class BoCustomer implements Serializable{ 

    String firstName 
    String lastName 
    String emailID 
    Company company 
} 

Por lo tanto, tienen una clave primaria = "id" que está bien. Además, necesito una clase de restricción única que "verifique" lo siguiente: "solo una dirección de correo electrónico única para una empresa", de modo que se permita la inserción del mismo correo electrónico, pero solo para empresas diferentes. Inserción ([email protected], empresa-id: 1) y la inserción ([email protected], empresa-id: 1) no está permitido, pero la inserción ([email protected], id-compañía: 1) e insertar ([email protected], id-compañía: 2) está permitido.

así que he intentado hasta ahora:

static mapping = { 
    id column: "customer_id", generator: "identity" 
    emailcompany composite: ['emailID', 'company'], unique: true 
} 

(parece ser "bueno", pero no es exactamente lo que quiero)

pero no quieren otra columna, en mi intento llamados " emailcompany "- pero necesito algo así como una restricción única.

Respuesta

1

Si desea imponer esto con una restricción, debería poder usar un validador personalizado para que devuelva falso si ya existe un BoCustmer con el mismo ID de correo electrónico y compañía. Ha sido un tiempo desde que he utilizado, pero creo que algo como esto debería funcionar:

class BoCustomer implements Serializable{ 
    String firstName 
    String lastName 
    String emailID 
    Company company 

    static constraints = { 
     emailID( 
      validator: { val, obj -> 
       def customerWithSameEmailAndCompany = BoCustomer.findByEmailIDAndCompany(obj.emailID, obj.company) 
       return !customerWithSameEmailAndCompany 
      } 
     ) 
    } 
} 
+0

Hola Kaleb, gracias por su respuesta, pero lo siento. Probé tu código, pero aún es posible agregar el mismo correo electrónico con el mismo ID de empresa dos veces (y más) :-( – grailsInvas0r

+0

¿Ejecutas un .validate() en la instancia de BoCustomer antes de llamar a .save()? Y si entonces, la validación devuelve verdadero? –

+0

Sí, ejecuto un .validate() antes de llamar a .save(). Y me está devolviendo "verdadero" sí, lo revisé con un punto de corte de depurador y una variable de prueba - está volviendo desafortunadamente: - \ – grailsInvas0r

7

Puede especificar este comportamiento por una de las principales limitaciones disponibles: unique

class BoCustomer implements Serializable{ 

    String firstName 
    String lastName 
    String emailID 
    Company company 

    static constraints = { 
     emailID(unique: 'company') 
      // OR 
     company(unique: 'emailID') 
    } 
} 

Puede vea la especificación completa de la restricción unique aquí http://grails.org/doc/latest/ref/Constraints/unique.html

Cuestiones relacionadas