2011-11-29 38 views
2

我不確定這是否可能,但這裏有一個例子。如何在Grails中表示一對多對另一個域類的約束?

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

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

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

一個人可以爲多個相冊寫多個評論,但我想限制他們只能爲每個相冊寫一篇評論。我一直在想辦法用constraints屬性來做到這一點,但還沒有能夠提出任何事情。

回答

4

只需添加一個唯一約束

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

    static constraints = { 
     album unique: 'author' 
    } 
} 

錯誤代碼時,這個約束被違反,將被解析爲review.album.unique

+0

衛生署!讓我的方式看起來非常複雜:)投票給唐,他的方式更好! – ubiquibacon

+0

謝謝,我知道這是沿着這些線。 – Pat

1

我不認爲你可以用約束來強制它,除非你可以得到類似多列唯一約束來處理Review類。因此,唯一的約束將是Review類中的相冊和作者屬性組合在一起。

我還沒有嘗試過,只是看到它的文檔在這裏:http://grails.org/doc/2.0.0.RC1/ref/Constraints/unique.html

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 
     }) 
    } 
}