我一段时间以来都在使用grails.还有一些我还不知道如何正确实现的东西.
我有一个域类(比方说User),它包含一个List,它可能是任何域类(Item,User等等).有没有办法让这个开箱即用?
目前我正在通过以下方式进行:
我有一个UserLink,其中包含以下属性:
class UserLink{
User user
String className
Long refId
}
然后我有一个服务,它为给定用户加载所有链接,然后加载链接中的相应对象,并将它们作为列表返回.
我认为这种方法不是最好的,可能导致未来的性能问题
你怎么看?你有更好的设计理念吗?
谢谢,
萨科
最佳答案 它真的是任何类,还是只有某个类的子集?我相信你会有更多与User没有直接关系的域类.
如果是这样,您可以使用belongsTo = [user:User] prop创建UserAsset类或接口,并继承/实现它.
然后找到实现它的所有域类,并使用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()