2013-03-12 3 views
0

Я пытаюсь разобраться с GORM и реляционным отображением. Отношения работают нормально, но есть одна проблема. Я не могу показаться слишком уверенным, что каждый MailAddress, добавленный к MailingList, имеет уникальный адрес. Каким должен быть эффективный способ сделать это?GORM, как обеспечить уникальность свойств связанных объектов

Примечание: На MailAddress.address нет единственного ограничения. Идентичные адреса могут существовать в одной таблице.

class MailAddress { 

    String name 
    String email 

    static belongsTo = MailingList 

    static constraints = { 
     name blank:true 
     email email:true, blank:false 
    } 
} 

class MailingList { 

    String name 

    static hasMany = [addresses:MailAddress] 

    static mapping = { 
     addresses cascade: 'all-delete-orphan' 
    } 

    static constraints = { 
     name blank:false 
    } 
} 

ответ

1

Как уже упоминалось в комментариях от @ibaralf, ответ является обычным валидатором. Класс MailingList должен быть проверен, если у всех адресов (MailAddress) есть уникальный адрес электронной почты.

Я добавил это ограничение в класс MailingList, и он сработал.

static constraints = { 
    name blank:false 

    addresses(validator: { 

     if (!it) { 
      // validates to TRUE if the collection is empty 
      // prevents NULL exception 
      return true 
     } 

     // Grab a collection with all e-mailaddresses in the list 
     def addressCollection = it*.email 
     // Compare to a collection with only unique addresses 
     return addressCollection == addressCollection.unique() 
    }) 
} 

Более подробную информацию можно найти здесь http://grails.org/doc/2.2.0/ref/Constraints/validator.html

0

Существует единственное ограничение, вы можете добавить:

static constraints = { 
    name blank:true 
    email email:true, blank:false, unique: true 
} 

=> поставить уникальное ограничение на переменную электронной почты (уникальный: истинный). Это предотвратит сохранение идентичных адресов электронной почты в таблице.

+0

Это проблема. Текущая таблица позволяет дублировать, которые я не могу изменить на данный момент. Я хочу только достичь уникальности между адресами в почтовом списке – Bart

+1

Если я правильно понял вас, вы хотите уникальность между ассоциацией hasMany. Если это так, вы можете посмотреть этот ответ http://stackoverflow.com/questions/4041939/how-to-set-uniqueness-at-db-level-for-a-one-to-many-association – ibaralf

+0

Спасибо для упоминания этого сообщения !! Я прочитал его несколько дней назад, но это дало мне головную боль, потому что предоставленный пример не работал. Поэтому я вернулся к документам и понял это. Спасибо за помощь. – Bart

Смежные вопросы