Grails one-to-many/ошибочное удаление всех множеств

у меня есть следующие (упрощенные) доменные классы

class Filter {
    String name
    static hasMany = [answers:Answer]
    static belongsTo = [user:User]
}

class User {
    String name
    static hasMany = [answers:Answer, filters:Filter]
}

class Answer {
    String text
}

Затем я добавляю ответы пользователю, который отлично работает. Проблема возникает, когда я удаляю 1 ответ пользователя:

def delete = {
    def answer = Answer.get(params.id)
    def users = User.withCriteria() {
        answers{
            eq("id", answer.id)
        }
    }

    for (user in users)
        user.removeFromAnswers(answer)

    answer.delete(flush:true)
    redirect(action:"index")
}

Что происходит здесь, так это то, что ВСЕ ассоциации пользователя -> ответа удаляются.

Я хочу удалить только этот 1 ответ и, конечно же, все ассоциации, в которых используется ответ.

Я знаю, что это связано с отсутствующим параметром ownTo, но я не могу его использовать, потому что ответ может принадлежать либо пользователю, либо фильтру...


person user1200271    schedule 09.02.2012    source источник


Ответы (1)


Вы можете добавить belongsTo, чтобы установить их на nullable:

class Answer {
    String text

    static belongsTo = [user:User, filter:Filter]
    static constraints = {
        user nullable:true
        filter nullable:true
    }
}

а затем просто удалите Answer прямо в контроллере:

def delete = {
    def answer = Answer.get(params.id)
    answer.delete(flush:true)
}

GORM позаботится об остальном каскадировании за вас.

person seth.miller    schedule 09.02.2012
comment
mhhh да, это работает... но тогда также возможно получить ответ без фильтра и без пользователя... Вот почему я старался не использовать ownTo. - person user1200271; 10.02.2012
comment
Ну ... ваш ответ на самом деле правильный для вопроса, который я задавал. Я предполагаю, что на самом деле мне нужно отношение «многие к маю» с двумя объединенными таблицами: 1 для ответов фильтра и 1 для ответов пользователя. GORM на самом деле делал это за меня, потому что я не указал отношения принадлежности к - person user1200271; 10.02.2012
comment
Без belongsTo все еще возможно иметь Answer без Filter и без User. Вы всегда можете добавить пользовательское ограничение или beforeInsert/beforeUpdate, чтобы этого не произошло. - person seth.miller; 10.02.2012