GORM:列出属于用户(根对象)的所有域实例

发布于 2024-11-05 05:05:56 字数 394 浏览 3 评论 0原文

我使用 grails 已经有一段时间了。有一些事情我仍然不知道如何正确实施。

我有一个域类(假设是用户),其中包含一个列表,该列表可能是任何域类(项目、用户等)。有没有办法让它开箱即用?

目前我正在按以下方式执行此操作:

我有一个包含以下属性的 UserLink:

class UserLink{
    User user
    String className
    Long refId
}

然后我有一个服务,它加载给定用户的所有链接,然后加载链接中的相应对象,并将它们作为列表返回。

我认为这种方法不是最好的,并且可能会导致未来的性能问题,

您对此有何看法?您有更好的设计想法吗?

谢谢, 尼古拉斯

I'm working with grails since a while. There is something I still don't know how to implement correctly.

I have a domain class (let's say User) which contains a List which can be potentially any domain class (Item, User, etc, etc). Is there a way to make this out of the box?

At the moment I'm doing it the following way:

I have a UserLink which contains following properties:

class UserLink{
    User user
    String className
    Long refId
}

Then I have a service which loads all links for a given user and then the corresponding objects in the link, and returns them as a list.

I think this approach is not the best, and could lead to future performance problems

What do you think? Do you have better design ideas?

Thanks,
Nicolas

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

好久不见√ 2024-11-12 05:05:56

它真的是任意的,还是只是类的某个子集?我相信您还会有更多与 User 不直接相关的域类。

如果是这样,您可以使用 belongsTo=[user: User] 属性创建一个 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()

Is it really any, or only a certain subset of classes? I believe you'll have some more domain classes not directly related to User.

If so, you can create a UserAsset class or interface with a belongsTo=[user: User] prop, and inherit/implement it.

Then find all domain classes implementing it, and query each with clazz.findByUser(), like:

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

edit: If we're talking M:M, it only changes last line, the way userAssetClasses are queried.

UserAsset will have a hasMany=[users:User] property.

Like:

List<UserAsset> allUserAssets = userAssetClasses.clazz.collect{ 
    Class domainClass ->
    it.withCriteria {
        users {
            eq('id', myUser.id)
        }
    }
}.flatten()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文