2011-10-07 44 views
6

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

规则:如果需要

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

Ticket.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. 我可以明确地设置邮政票属性指向父票。

但是,该映射不在域级别实施。它为Ticket1指向Post1留下空间,但Post1指向Ticket2。

我试图在票务类使用static hasOne = [post: Post],但后来才知道,它要求一个static belongsTo = [ticket: Ticket]类的存在,这成为一个强制性的1对1的关系这是不是我寻找。

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

+0

如果回答满意,请关闭问题。谢谢! :-) – sbglasius

+0

它不起作用。我不认为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 
     } 
    }) 
    } 
} 

自定义验证这是否解决问题了吗?

+0

嗨,谢谢你的解决方案!它的工作原理(用小编辑完成),比以前的情况要好,因为现在至少在一端进行验证。但是,现在仍然有可能在Post中设置正确的票据参数(因为验证程序强制执行该参数),但是返回Ticket并更改它指向的Post对象。我只是想知道是否有办法从两端强制执行它,但我想这不是吗? :( –

+0

如何在另一端进行另一种验证?应该有可能吗? – sbglasius

+0

现在就试试看 –