Как писать ограничения для свойств hasMany в grails

У меня есть три класса в приложении grails

class Category {
    String name
}

class Application {
    String name
    static hasMany =[specialCategoryies:SpecialCategory]
}

class SpecialCategory {
    Category category
    Integer points
    static belongsTo =[application:Application]
}

Здесь, пока я сохраняю applicationInstance, я не хочу сохранять повторяющиеся значения specialCategories, такие как ..specialCategories, снова не имеет того же значения категории ..

application.addToSpecialCategoryies(newSpecialCategory(category:Category.get(1),points:2))
application.addToSpecialCategoryies(newSpecialCategory(category:Category.get(1),points:3))

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


person user1893817    schedule 06.12.2013    source источник
comment
Я не думаю, что вы сможете использовать hasMany из коробки для этого. Вероятно, лучшим решением является определение ваших собственных отношений, связывающих тип домена и применение правил с уникальным ограничением.   -  person derdc    schedule 06.12.2013


Ответы (1)


Вы можете попробовать использовать настраиваемый валидатор в разделе ограничений приложения. Например, один из способов проверить повторяющиеся значения свойств - собрать значения в массив и сравнить их с соответствующим массивом unique (с удалением повторяющихся элементов):

class Application {

    String name
    static hasMany =[specialCategoryies:SpecialCategory]

    static constraints = {
        specialCategoryies validator: { specialCategories, obj ->

            def specialCategoriesIdArray =  specialCategories.collect {it?.category?.getId()}
            return (specialCategoriesIdArray.size() == specialCategoriesIdArray.unique().size())?true:'application.validator.specialcategoryduplicate.error'

        }
    }
}

При попытке сохранить специальную категорию с существующей категорией при сохранении будет выдана ошибка проверки. Вы можете проверить следующее:

    def cat1 = new Category(name:"Cat 1").save(flush:true)
    def cat2 = new Category(name:"Cat 2").save(flush:true)

    def app = new Application()
    app.name = "Test"

    app.addToSpecialCategoryies(new SpecialCategory(category: Category.get(1), points:2))
    app.addToSpecialCategoryies(new SpecialCategory(category: Category.get(2), points:2))
    app.addToSpecialCategoryies(new SpecialCategory(category: Category.get(1), points:3))

   if ( app.save(flush:true)   ){
          log.info "Saved!"
   }   else {
          log.error "NOT Saved. Error:"
       app.errors.each {
           log.error it
       }
   }
person ThisIsMatt    schedule 28.01.2015