2011-10-07 5 views
6

ユーザ間の投稿/ディスカッションをアップグレードしてチケットにするシステムを設計しています。 1つの特定の場所では、私は1対1のオプションの関係を作成しようとしていますが、特定の問題にぶつかっています。スポットライト内のエンティティの要約を以下に示します。Grails/GORM:1対1のオプションの関係を作成する

ルール:必要に応じて

  1. A Postはチケットになることができます。 (オプション)
  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. がnullの場合属性とポストは
  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

こんにちは、あなたのソリューションに感謝!少なくとも1つの端で妥当性検査が行われているので、それは(小さな編集で)機能し、以前の状況より優れています。しかし、今では、正しいチケット引数をPostに設定する可能性があります(バリデーターがそれを実施するので)が、Ticketに戻り、それが指すPostオブジェクトを変更します。私は両端からそれを強制する方法があるかどうか疑問に思っていましたが、そうではないと思いますか? : –

+0

もう一方の検証はどうですか?可能でしょうか? – sbglasius

+0

これを試してみてください –