我一直在使用grails。还有一些我还不知道如何正确实现。
我有一个域类(比方说User),它包含一个List,它可能是任何域类(Item,User等等)。有没有办法让这个开箱即用?
目前我正按以下方式进行:
我有一个UserLink,其中包含以下属性:
class UserLink{
User user
String className
Long refId
}
然后我有一个服务,它为给定用户加载所有链接,然后加载链接中的相应对象,并将它们作为列表返回。
我认为这种做法不是最好的,可能导致未来的性能问题
你怎么看?你有更好的设计理念吗?谢谢, 尼古拉斯
答案 0 :(得分:2)
它真的是任何类,还是只有某个类的子集?我相信你会有更多与User没有直接关系的域类。
如果是这样,您可以使用UserAsset
道具创建belongsTo=[user: User]
类或接口,并继承/实现它。
然后找到实现它的所有域类,并使用clazz.findByUser()
查询每个类,如:
GrailsClass[] classes = grailsApplication.getArtefacts('Domain')
GrailsClass[] userAssetClasses =
classes.clazz.findAll { UserAsset.class.isAssignableFrom(it) }
List<UserAsset> allUserAssets =
userAssetClasses.clazz*.findAllByUser(myUser).flatten()
编辑:如果我们正在谈论M:M,它只会更改最后一行,即查询userAssetClasses
的方式。
UserAsset
将拥有hasMany=[users:User]
属性。
像:
List<UserAsset> allUserAssets = userAssetClasses.clazz.collect{
Class domainClass ->
it.withCriteria {
users {
eq('id', myUser.id)
}
}
}.flatten()