GORM: список всех экземпляров домена, принадлежащих пользователю (корневой объект) - PullRequest
4 голосов
/ 06 мая 2011

Я работаю с Граалем с тех пор. Есть кое-что, что я до сих пор не знаю, как правильно реализовать.

У меня есть класс домена (скажем, пользователь), который содержит список, который может быть любым классом домена (элемент, пользователь и т. Д. И т. Д.) Есть ли способ сделать это из коробки?

На данный момент я делаю это следующим образом:

У меня есть UserLink, который содержит следующие свойства:

class UserLink{
    User user
    String className
    Long refId
}

Затем у меня есть служба, которая загружает все ссылки для данного пользователя, а затем соответствующие объекты в ссылке и возвращает их в виде списка.

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

Что вы думаете? У вас есть лучшие дизайнерские идеи?

Спасибо, Nicolas

1 Ответ

2 голосов
/ 06 мая 2011

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

Если это так, вы можете создать класс или интерфейс UserAsset с помощью belongsTo=[user: User] prop и наследовать / реализовать его.

Затем найдите все классы домена, реализующие его, и запросите каждый с помощью clazz.findByUser(), например:

GrailsClass[] classes = grailsApplication.getArtefacts('Domain')
GrailsClass[] userAssetClasses = 
    classes.clazz.findAll { UserAsset.class.isAssignableFrom(it) }
List<UserAsset> allUserAssets = 
    userAssetClasses.clazz*.findAllByUser(myUser).flatten()

edit : Если мы говорим M: M, это только изменяет последнюю строку, способ userAssetClasses запрашивается.

UserAsset будет иметь свойство hasMany=[users:User].

Как:

List<UserAsset> allUserAssets = userAssetClasses.clazz.collect{ 
    Class domainClass ->
    it.withCriteria {
        users {
            eq('id', myUser.id)
        }
    }
}.flatten()
...