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

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

 class Metric {

   String name
   float value

   static belongsTo = [Person,Corporation]

   static indexes = {
    name()
 }
}

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

Спасибо.

1
задан xain 4 June 2010 в 19:33
поделиться

3 ответа

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

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)
2
ответ дан 3 September 2019 в 00:03
поделиться

Прежде чем я продолжу свой ответ, я хочу предупредить, что в 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'])
  }
}

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

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

0
ответ дан 3 September 2019 в 00:03
поделиться

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

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

0
ответ дан 3 September 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: