6

ユーザー間の投稿/ディスカッションをチケットにアップグレードできるシステムを設計しています。ある特定の場所で、1 対 1 の任意の関係を作成しようとしていますが、特定の問題が発生しています。脚光を浴びているエンティティの要約版を以下に示します。

ルール:

  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. チケットがアップグレードされた場合、チケット属性nullを残す投稿を作成します。
  2. 親チケットを指すように、Post のチケット属性を明示的に設定できます。

ただし、このマッピングはドメイン レベルでは適用されません。Ticket1 が Post1 を指しているが、Post1 が Ticket2 を指しているという状況の余地があります。

Ticketstatic hasOne = [post: Post]クラスで aを使用しようとしましたが、Postクラスに a が存在することが必須であり、これが必須の 1 対 1 の関係になることを後で知りました。これは私が探しているものではありません。static belongsTo = [ticket: Ticket]

このシナリオでこの 1 対 1 のオプションのマッピングを実現する方法はありますか? どんなポインタでも最も役に立ちます。

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 に答える