1 votes

Question de contrainte GORM de Grails

J'ai la classe de domaine suivante:

 class Metric {

   String name
   float value

   static belongsTo = [Person,Corporation]

   static indexes = {
    name()
 }
}

Comment puis-je ajouter une contrainte afin que Personne, Corporation et nom soient uniques ?

Merci.

2voto

Steven Dorfmeister Points 160

Je pense que cela devrait fonctionner..ajoutez ceci à Metric. Bien entendu, vous pouvez ignorer les valeurs nulles si vous le souhaitez.

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 semblait 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)

0voto

Gregg Points 12141

Voici un lien vers une situation similaire, légèrement différente. Mais assez proche. Cela pourrait vous donner une autre bonne idée sur la façon de faire cela.

http://johnrellis.blogspot.com/2009/09/grails-constraints-across-relationships.html

0voto

Tiggerizzy Points 819

Avant de continuer avec ma réponse, je tiens à préciser que avec Grails 1.2.x (peut-être aussi avec 1.3.x) les contraintes d'unicité composées sont cassées si l'une des valeurs peut être nulle. Si vous ne pouvez pas vous passer d'un comportement unique, vous pouvez utiliser une validation personnalisée pour contourner le problème. Voir : https://cvs.codehaus.org/browse/GRAILS-5101

La manière appropriée d'accomplir que votre classe de domaine Metric soit unique pour les champs nom, personne et corporation.

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 déclarer personne et corporation comme membres de votre modèle. Vous pouvez même supprimer le static belongsTo si vous ne vous souciez pas du comportement de suppression en cascade.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X