6

我正在设计一个系统,用户之间的帖子/讨论可以升级为门票。在一个特定的地方,我试图创建一对一的可选关系,但遇到了某些问题。下面给出了聚光灯下实体的精简版本。

规则:

  1. 如果需要,帖子可以成为票证。(可选的)
  2. 一张票必须有一个帖子。(强制的)

Post.groovy

class Post {

        String title
        String description
        String postedBy

        Ticket ticket

        static hasMany = [comments: Comment]

    static constraints = {
        title(blank:false)
        description(blank:false)
        postedBy(blank:false)
        ticket (nullable:true,unique:true)
    }
}

票务.groovy

class Ticket {

        String title
        String description
        String postedBy

        Post post

        static hasMany = [responses: Response]

        static constraints = {
                title(blank:false)
                description(blank:false)
                postedBy(blank:false)
                post (nullable:false,unique:true)
        }

}

这在某种程度上有效。我可以:

  1. 创建一个帖子,将票证属性保留为空如果以及何时将帖子升级为票证
  2. 我可以将 Post 的票证属性显式设置为指向父票证。

但是,此映射并未在域级别强制执行。它为 Ticket1 指向 Post1,但 Post1 指向 Ticket2 的情况留下了空间。

我尝试static hasOne = [post: Post]Ticket类中使用 a ,但后来了解到它要求static belongsTo = [ticket: Ticket]Post类中存在 a ,这成为强制性的一对一关系,这不是我想要的。

在这种情况下,有没有办法实现这种一对一的可选映射?任何指针都是最有帮助的。

4

1 回答 1

3

您可以考虑制作一个自定义验证器,例如

class Post {
  // Other fields

  Ticket ticket

  static constraints = {
    // Other constraints
    ticket (nullable:true,unique:true, validator: { val, obj ->
       if(val) {
         return val.post == obj
       }
    })
  }
}

这会解决你的问题吗?

于 2011-10-07T09:02:35.590 回答