我在grails应用程序中有三个类
class Category {
String name
}
class Application {
String name
static hasMany =[specialCategoryies:SpecialCategory]
}
class SpecialCategory {
Category category
Integer points
static belongsTo =[application:Application]
}
在此处保存应用程序实例时,我不希望保存重复specialCategories值,如。。specialCategories不具有相同的类别值。。
application.addToSpecialCategoryies(newSpecialCategory(category:Category.get(1),points:2))
application.addToSpecialCategoryies(newSpecialCategory(category:Category.get(1),points:3))
这里我的应用实例应该会出现类别值重复的错误。。那么如何定义域类中hasMany属性的约束。。。。。。?建议如何编写约束以避免类别的重复值
您可以尝试在应用程序约束部分使用自定义验证器。例如,检查重复属性值的一种方法是将值收集到一个数组中,并将其与相应的唯一数组(删除重复元素)进行比较:
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
}
}