如何在Grails中表示一对多,对另一个域类有约束?

时间:2011-11-29 23:43:03

标签: grails constraints

我不确定这是否可行,但这是一个例子。

class Album {
   static hasMany = [ reviews: Review ]
}

class Author {
   static hasMany = [ reviews: Review ]
}

class Review {
   static belongsTo = [ album: Album, author: Author ]
}

一个人可以为多个专辑写多个评论,但我想限制它们只能为每个专辑写一个评论。我一直试图想办法用约束属性来做到这一点,但还没有想出任何东西。

3 个答案:

答案 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