У меня есть следующий Доменный Класс:
class Metric {
String name
float value
static belongsTo = [Person,Corporation]
static indexes = {
name()
}
}
Как я могу добавить ограничение так Человек, Корпорация и имя уникальны?
Спасибо.
Я думаю, это должно сработать .. добавьте это в метрику. Очевидно, вы можете игнорировать значения 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)
Прежде чем я продолжу свой ответ, я хочу предупредить, что в 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, если вас не волнует поведение каскадного удаления.
В приведенном выше примере имя должно быть уникальным для человека и корпорации; лицо должно быть уникальным по имени и корпорации, и, наконец, корпорация должна быть уникальной по имени и личности.
Вот ссылка на похожую ситуацию, немного другую. Но довольно близко. Могу дать вам еще одно хорошее представление о том, как это сделать.
http://johnrellis.blogspot.com/2009/09/grails-constraints-across-relationships.html