Вопрос ограничения Grails GORM

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

 class Metric {

   String name
   float value

   static belongsTo = [Person,Corporation]

   static indexes = {
    name()
 }
}

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

Спасибо.


person xain    schedule 04.06.2010    source источник
comment
убедитесь, что вы хотите этого. человек мог работать в корпорации в разное время, возможно, на разных должностях.   -  person Ray Tayek    schedule 05.06.2010


Ответы (3)


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

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)
person Steven Dorfmeister    schedule 04.06.2010
comment
Однако одно и то же имя может использоваться для разных корпораций или групп. - person Ben Doerr; 07.06.2010

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

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

person Gregg    schedule 05.06.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'])
  }
}

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

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

person Ben Doerr    schedule 07.06.2010