2011-11-06 15 views
7

Sono molto vicino a una soluzione ma tutto è ancora sbagliato, spero di ricevere aiuto, grazie in anticipo.grails composito "vincolo unico", ma come?

Ho un modello di dominio del cliente come:

class BoCustomer implements Serializable{ 

    String firstName 
    String lastName 
    String emailID 
    Company company 
} 

Quindi, ho una chiave primaria = "id" va bene così. Quindi ho bisogno di una sorta di vincolo univoco che "controlli" quanto segue: "solo un indirizzo email univoco per una società" in modo che l'inserimento della stessa e-mail sia consentito ma solo per società diverse. Inserimento ([email protected], società-id: 1) e inserendo ([email protected], società-id: 1) non è consentito, ma l'inserimento ([email protected], company-id: 1) e l'inserimento ([email protected], company-id: 2) è consentito.

Così ho provato finora:

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

(sembra essere "buono", ma non esattamente quello che voglio)

ma io non voglio un'altra colonna, nella mia prova chiamato " emailcompany "- ma ho bisogno di qualcosa come un vincolo unico.

risposta

1

Se si desidera applicare questo valore con un vincolo, si dovrebbe essere in grado di utilizzare un validatore personalizzato in modo che restituisca false se esiste già un BoCustmer con lo stesso ID e-mail e società. E 'stato un po' che ho usato, ma penso che qualcosa del genere dovrebbe funzionare:

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

Hey Kaleb, grazie per la risposta, ma mi dispiace. Ho provato il tuo codice ma è ancora possibile aggiungere la stessa e-mail con lo stesso ID della società due volte (e più) :-( – grailsInvas0r

+0

Esegui un .validate() nell'istanza BoCustomer prima di chiamare .save()? E se così, la convalida restituisce true? –

+0

Sì, eseguo un .validate() prima di chiamare .save(). E restituisce "true" sì, lo ho controllato con il breakpoint del debugger e una variabile di test - restituisce true purtroppo: - \ – grailsInvas0r

7

È possibile specificare questo comportamento da uno dei principali vincoli disponibili: unique

class BoCustomer implements Serializable{ 

    String firstName 
    String lastName 
    String emailID 
    Company company 

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

Puoi vedere le specifiche complete del vincolo unique qui http://grails.org/doc/latest/ref/Constraints/unique.html

Problemi correlati