Как справиться со многими ко многим в Grails без принадлежащих? - PullRequest
8 голосов
/ 05 мая 2010

Мне нужно создать отношения «многие ко многим» в Grails.

У меня есть домен «Вопрос» и домен «Тэг». Вопрос может иметь 0 или более тегов. Тег может иметь 0 или более вопросов.

Если я добавлю hasMany с каждой стороны, это выдаст мне ошибку, говорящую, что мне нужно где-то принадлежать. Однако добавление ownTo означает, что владелец должен существовать ...

Как я уже сказал, у тега может быть 0 вопросов, а у вопроса может быть 0 тегов. Там нет понятия владельца, это много ко многим!

Что я должен делать?

Ответы [ 5 ]

6 голосов
/ 09 мая 2010

Вы можете сделать это (см. Код ниже). но имеет ли смысл иметь тег вопроса без вопроса и тега?

    package m2msansbt

    class Question {
        String toString() { return name }
        String name
        static hasMany=[questionTags:QuestionTag]
        static constraints = {
        }
    }
    package m2msansbt

    class Tag {
        String toString() { return name }
        String name
        static hasMany=[questionTags:QuestionTag]
        static constraints = {
        }
    }
package m2msansbt

class QuestionTag {
    Question question
    Tag tag
    static QuestionTag link(Question question,Tag tag) {
        QuestionTag questionTag=QuestionTag.findByQuestionAndTag(question,tag)
        if (!questionTag) {
            questionTag = new QuestionTag()
            question?.addToQuestionTags(questionTag)
            tag?.addToQuestionTags(questionTag)
            questionTag.save() 

        }
        return questionTag
    }
    static void unlink(Question question,Tag tag) {
        QuestionTag questionTag=QuestionTag.findByQuestionAndTag(question,tag)
        if (questionTag) {
            question?.removeFromQuestionTags(questionTag)
            tag?.removeFromQuestionTags(questionTag)
            questionTag.delete()
        }
    }
    static constraints = {
    }
}

 import m2msansbt.*
 class BootStrap {

         def init = { servletContext ->
            Question q1=new Question(name:'q1')
            Tag t1=new Tag(name:'t1')
            Tag t2=new Tag(name:'t2')
            q1.save()
            t1.save()
            t2.save()
            QuestionTag q1t1=QuestionTag.link(q1,t1)
            q1t1.save()
            QuestionTag q1t2=QuestionTag.link(q1,t2)
            q1t2.save()
            q1.save()
            t1.save()
         }
         def destroy = {
         }
    }
2 голосов
/ 05 мая 2010

Если ваша главная проблема - каскадное удаление, вы можете взглянуть на 5.5.2.9 в документе grails, чтобы вручную отключить его для отображения.

0 голосов
/ 07 марта 2015

Это работает для меня на Grails 2.4.4. Добавьте "ownTo" только с именем класса.

class Question {
    String toString() { return name }
    String name
    static hasMany=[tags:Tag]
    static constraints = {
    }
}


class Tag {
    String toString() { return name }
    String name
    static hasMany=[questions:Question]

    static belongsTo = Question

    static constraints = {
    }
}
0 голосов
/ 06 мая 2010

Оформить заказ на Taggable Plugin .

Похоже, это решает проблему, с которой вы столкнулись, и вы можете посмотреть исходный код , если хотите увидеть, как они смоделировали отношения. Кстати, этот плагин был первоначально создан Грэмом Роше, который является ведущим разработчиком Grails.

0 голосов
/ 05 мая 2010

Я не пробовал, но, думаю, для решения этой проблемы можно использовать свойство mappedBy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...