Вопрос об ограничении GORM Грааля - PullRequest
1 голос
/ 04 июня 2010

У меня есть следующий класс домена:

 class Metric {

   String name
   float value

   static belongsTo = [Person,Corporation]

   static indexes = {
    name()
 }
}

Как добавить ограничение, чтобы Person, Corporation и имя были уникальными?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 05 июня 2010

Я думаю, что это должно сработать .. добавить это в Метрику. Очевидно, вы можете игнорировать обнуляемые, если хотите.

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

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

Я тестировал с этим интеграционным тестом, и, похоже, он работал.

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 голосов
/ 07 июня 2010

Прежде чем я продолжу свой ответ, я хочу предупредить, что с Grails 1.2.x (возможно, и 1.3.x) составные уникальные ограничения нарушаются, если любое из значений может быть нулевым. Если вы не можете жить без уникального поведения, вы можете использовать собственную проверку, чтобы добиться цели. См .: https://cvs.codehaus.org/browse/GRAILS-5101

Правильный способ добиться того, чтобы ваш класс домена Metric был уникальным в имени, лице и корпорации.

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'])
  }
}

Вам нужно будет вызвать человека и корпорацию в качестве членов вашей модели. Вы можете даже удалить статическую принадлежность, если вам не нужно каскадное удаление.

В приведенном выше примере имя должно быть уникальным лично и корпорации; человек должен быть уникальным по имени и корпорации, и, наконец, корпорация должна быть уникальной по имени и личности.

0 голосов
/ 05 июня 2010

Вот ссылка на похожую ситуацию, немного другую. Но довольно близко. Может дать вам еще одну хорошую идею о том, как это сделать.

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

...