Сдерживающие отношения в доменном классе (Grails) - PullRequest
0 голосов
/ 25 июня 2010

Я не уверен, правильная ли это терминология для такого рода отношений, поэтому, пожалуйста, поправьте меня.Мне нужно определить класс домена, который сопоставляется с таблицей в базе данных.Класс должен определить иерархию отношений одного типа.Например, скажем, мне нужно смоделировать нижеуказанные роли с тем же классом Admin> Manager> Supervisor> associate ... и т. Д.

class RoleType {
    String roleName
    String description

    static hasMany = [parentType: RoleType]
}

, поэтому через родительский тип я смогу определить иерархию.Обратите внимание, что это не наследование.Я также могу определить отношение 1: m к непосредственному ребенку.Теперь, как легко я могу найти содержащиеся объекты.Например, если мне нужно найти все роли ниже менеджера (скажем, супервизор, ассоциированный) или под супервизора (ассоциированный) и т. Д., Я использую Grails.

спасибо.

1 Ответ

1 голос
/ 25 июня 2010

Определение отношения

То, что вы определяете, является однонаправленным один-ко-многим, причем родитель является «владельцем» отношений. Если вы определите это так:

class RoleType {
    String roleName
    String description
    static hasMany = [children: RoleType]
}

Тогда вы можете сделать что-то вроде этого:

def superManager = new RoleType(roleName: 'SuperManager')
def manager = new RoleType(roleName: 'Manager')

superManager.addToChildren(manager);

Или я верю, что вы можете записать одно и то же:

def superManager = new RoleType(roleName: 'SuperManager').addToChildren(roleName: 'Manager').save()

Определяя отношения с [children: RoleType], Grails создает коллекцию в домене с именем children, к которой вы можете получить доступ, как и к любому другому свойству, например, myRole.children.each { it.doSomething() }.

Чтобы упростить работу, вы также можете сделать отношение двунаправленным, добавив следующее свойство:

RoleType parent

Если вы используете динамические методы addTo*, они должны гарантировать, что оба конца отношения правильно установят свои свойства. Посмотрите на это для дополнительной справки.

Восстановление всех потомков

У вас есть несколько вариантов, но я не думаю, что в GORM есть способ сделать это автоматически.

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

В качестве альтернативы, если вы часто выполняете этот метод, и он становится узким местом, вы можете выполнить некоторые ручные манипуляции с вашей базой данных. У вас могут быть триггеры, которые работают со вставками и обновлениями в вашей таблице RoleType, которые поддерживают списки неявных связей между всеми типами RoleType.

Например, если вы создаете отношение RoleType A -> RoleType B -> RoleType C, триггеры могут создать (в отдельной таблице) a RoleType A -> RoleType B, RoleType A -> RoleType C и RoleType B -> RoleType C отношения. Затем вы можете запросить эту таблицу одним родителем и получить все ее предполагаемые потомки / потомки. Я видел это сделано для сложной обработки ACL.

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