2016-12-01 5 views
1

Если у меня есть домен Person и хобби домена, а Person hasMany Hobby, то как я могу убедиться, что одно и то же Хобби не добавляется более одного раза в коллекцию Person.Уникальное ограничение Grails на список доменов

т.е. что-то вроде

`

class Hobby { 
     String name 
     static belongsTo = [person: Person] 
    } 
    class Person 
     String name 

     static hasMany =[hobby: Hobby] 

     static constraints= { 
     hobby.name unique: true   //like this 
     } 
    } 

ответ

1

Это префект случай использования для пользовательского validator. Я предлагаю чтение documentation так что вы получите чувство для того, что возможно с одним, но вы могли бы использовать что-то вроде этого:

class Hobby { 
    String name 
    static belongsTo = [person: Person] 
} 
class Person 
    String name 

    static hasMany = [hobby: Hobby] 

    static constraints = { 
     hobby validator: { val, obj -> 
     if (obj.hobby.find{ (it.name.equals(val.name) && it.id != val.id) }) return ['unique'] 
     } 
    } 
} 

выше только что-то с верхней части моей головы, может быть опечатки или логика ошибки, но это пример того, как вы можете реализовать свою собственную проверку с помощью настраиваемого validator.

UPDATE Ответ Грегг о том, чтобы Hobby уникальных в Person на самом деле гораздо проще и чище способ решения этой проблемы. Как он указывает, на самом деле нет необходимости в специальном валидаторе, поскольку существует соотношение между Person и Hobby.

0

В документации (http://docs.grails.org/2.5.5/guide/GORM.html#sets,ListsAndMaps) указано, что коллекция, определенная с помощью hasMany, является java.util.Set. И Set не может содержать дубликаты.

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

+0

Я не думаю, что это сработало. Уникальным в наборе является идентификатор. То, что я пытаюсь предотвратить, дублирует поле «имя». – user1023110

+0

ОК, поймите, чем сделайте имя в Хобби уникальным. –

+0

Да, я тоже не думаю, что это работает. Возможно, что у двух отдельных людей есть хобби под названием «Рыбалка» – user1023110

3

Я знаю, что это был дан ответ, но самый простой способ действительно сделать это:

class Hobby { 
    String name 
    static belongsTo = [person: Person] 

    static constraints = { 
    name unique: 'person' 
    } 
} 

Это гарантирует, что hobby имеет уникальное имя на его родителей, person. Нет необходимости в специальном валидаторе.

+1

Отличная точка Грегг! Полагаю, я должен закончить свой утренний кофе, прежде чем отвечать на вопросы. –

+0

@JoshuaMoore Я читал ваш ответ и вопрос много раз, прежде чем добавлять мои. Я думал, что Джошуа знает, что он здесь делает. :) Думал, что мне что-то не хватает. – Gregg

+1

Спасибо за вотум доверия :) –