2010-06-04 3 views
1

je la classe de domaine suivants:Grails' GORM contrainte question

class Metric { 

    String name 
    float value 

    static belongsTo = [Person,Corporation] 

    static indexes = { 
    name() 
} 
} 

Comment puis-je ajouter une contrainte si personne, société et le nom sont uniques?

Merci.

+0

assurez-vous que vous le souhaitez. une personne pourrait travailler pour un corp à différents moments avec peut-être des positions différentes. –

Répondre

2

Je pense que cela devrait marcher ... ajoutez ceci à Metric. Évidemment vous pouvez ignorer les nullables si vous voulez.

static constraints = { 
     name(blank:false) 
     corporation(nullable:false) 
     person(nullable:false) 

     name(unique:['corporation','person']) 
    } 

J'ai testé avec ce test d'intégration et cela a semblé fonctionner.

def newCorp = new Corporation(name:"Corporation1") 
newCorp.save() 
def newPerson = new Person(name:"Person1") 
newPerson.save() 

def newMetric = new Metric(name:"Metric1",corporation:newCorp,person:newPerson) 
newMetric.save() 

newMetric = new Metric(name:"Metric1",corporation:newCorp,person:newPerson) 
newMetric.save() 

assertTrue (Metric.list().size == 1) 
+0

Cependant, il peut y avoir le même nom utilisé pour différentes sociétés ou groupes. –

0

Avant de poursuivre avec ma réponse que je veux mise en garde que, avec Grails 1.2.x (1.3.x peut-être aussi) des contraintes uniques composés sont brisées si l'une des valeurs peut être NULL. Si vous ne pouvez pas vivre sans un comportement unique, vous pouvez utiliser une validation personnalisée pour faire l'affaire. Voir: https://cvs.codehaus.org/browse/GRAILS-5101

La bonne façon d'obtenir que votre classe de domaine Metric soit unique au sein du nom, de la personne et de la société.

class Metric { 

    String name 
    float value 
    Person person 
    Corporation corporation 

    static belongsTo = [person: Person, corporation: Corporation] 

    static indexes = { 
    name() 
    } 

    static constraints = { 
    name(unique:['person', 'corporation']) 
    person(unique:['name', 'corporation']) 
    corporation(unique:['name', 'person']) 
    } 
} 

Vous devrez appeler une personne et une société en tant que membres de votre modèle. Vous pourriez même laisser tomber l'belongsTo statique si vous ne vous souciez pas du comportement de suppression en cascade.

Dans l'exemple ci-dessus, le nom doit être unique en personne et en corporation; personne doit être unique dans le nom et la société, et enfin la société doit être unique dans le nom et la personne.

Questions connexes