Рекурсивная выборка в отношениях Грааля - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующий класс домена grails, содержащий собственные отношения.

class Message {
    static hasMany = [replies: Message]

    Message isReplyTo
    User author
    String title
    String text
    Date createdAt
    Date lastUpdated
}

Я хочу написать запрос, который может сделать две вещи

  1. Еслисообщение является родительским, то есть оно не является ответом на любое другое сообщение, извлекает список сообщений, которые создают диалог, начинающийся с этого сообщения.

    Message 1
    ---- Reply 1
    ---- Reply 2
    -------- SubReply 1
    
  2. Учитывая сообщение, являющееся ответом, на другое сообщение, также создайте список, такой же, как указано выше, включая того родителя, к которому относится данное сообщение (ответ).

Я думал об этом, но не могу придумать возможный способ сделать это, так как не существует класса домена Conversations, который связывает сообщение, принадлежащее к одному и тому же диалогу.Поэтому я надеюсь, что есть какой-то рекурсивный запрос, который поможет мне достичь этого.

1 Ответ

0 голосов
/ 28 ноября 2018

Есть несколько способов справиться с этим типом структуры, и в Интернете нет недостатка в примерах об этом типе древовидных отношений.

В простейшем подходе;у вас может быть структура Parent Child, в которой родительский элемент null будет сигнализировать о вершине дерева, а дочерний элемент с нулевым значением - о конце этой ветви.Это простая и эффективная структура, но она может быть сложной для сбора метрик, потому что вам всегда придется рекурсивно искать всю цепочку.

  Message{
    ...
    Message parent
    Message child
  }

Этот пост показывает хорошую рекурсиюв примере GSP:

Другой образец для этого - материализованный путь.Это немного обманчиво для реализации, но легко работать, когда оно на месте.Материализованные пути также намного проще собирать метрики для одинакового количества ответов, а также делать хлебные крошки гораздо проще.

  Message{
    ...
    Message parent
    String path //would like something like this: 1/2/3/4
  }

Для поиска в поиске пути к материализованному пути посмотрите google или этот пост,

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