我不确定这是否可行,但这是一个例子。
class Album {
static hasMany = [ reviews: Review ]
}
class Author {
static hasMany = [ reviews: Review ]
}
class Review {
static belongsTo = [ album: Album, author: Author ]
}
一个人可以为多个专辑写多个评论,但我想限制它们只能为每个专辑写一个评论。我一直试图想办法用约束属性来做到这一点,但还没有想出任何东西。
答案 0 :(得分:4)
只需添加一个唯一约束
class Review {
static belongsTo = [ album: Album, author: Author ]
static constraints = {
album unique: 'author'
}
}
违反此约束时将解决的错误代码为review.album.unique
答案 1 :(得分:3)
我假设Author
类的一个实例是对专辑评论的作者,换句话说就是评论者"。如果是这样,Review
课程中的以下验证者将确保作者尚未审阅该专辑。有关自定义验证程序的详细信息,请参阅http://grails.org/doc/1.3.x/ref/Constraints/validator.html。
class Album {
static hasMany = [ reviews: Review ]
}
class Author {
static hasMany = [ reviews: Review ]
}
class Review {
static belongsTo = [ album: Album, author: Author ]
static constraints = {
author(validator: {
val, obj ->
for(review in obj.album.reviews){
if(review.author == val){
return 'doubleEntry' //Corresponds to the "review.author.doubleEntry" error in your message.properties file which you will need to create by adding the line "review.author.doubleEntry=You cannot review this Album twice!" to your message.properties file.
}
}
return true
})
}
}
答案 2 :(得分:1)
我不认为您可以使用约束来强制执行它,除非您可以使用多列唯一约束来处理Review类。因此,唯一约束将是在Review类上组合在一起的专辑和作者属性。
我还没有尝试过,只是在文档中看到它:http://grails.org/doc/2.0.0.RC1/ref/Constraints/unique.html