Grails / GORM: создание необязательных отношений один-к-одному - PullRequest
6 голосов
/ 07 октября 2011

Я разрабатываю систему, в которой сообщения / обсуждения между пользователями могут быть обновлены, чтобы стать билетами. В одном конкретном месте я пытаюсь создать необязательные отношения один к одному, но сталкиваюсь с определенными проблемами. Краткое описание сущностей в центре внимания приведено ниже.

Правила:

  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. Я могу явно установить атрибут билета Post, чтобы он указывал на родительский билет.

Однако это сопоставление не применяется на уровне домена. Это оставляет место для ситуации, когда Ticket1 указывает на Post1, но Post1 указывает на Ticket2.

Я пытался использовать static hasOne = [post: Post] в классе Ticket , но позже узнал, что он требует наличия static belongsTo = [ticket: Ticket] в классе Post , и это становится обязательным 1- отношения к-1, которые я не ищу.

Есть ли способ добиться этого дополнительного отображения 1 к 1 в этом сценарии? Любые указатели будут наиболее полезны.

1 Ответ

3 голосов
/ 07 октября 2011

Вы могли бы подумать о создании собственного валидатора, например

class Post {
  // Other fields

  Ticket ticket

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

Это решит вашу проблему?

...