1

我有这个controller.method 渲染与配置文件关联的所有内容,并具有正确的偏移量和gsp中分页的最大值

    if (profil) {
        def max = params.max ? params.max as int : 5
        def offset = params.offset ? params.offset as int : 0
        List things = []

        things = Things.findAllByProfil(profil,[max: max, offset: offset, sort: 'dtCreated', order: 'desc'])
        [profil: profil, things: things, thingsCount: things.size()]
    }

但现在我有一个特殊的“聚合配置文件”,它有一些相关的配置文件,我想把所有相关配置文件的所有东西都放在一个列表中,比如:

    if (profil) {
        def max = params.max ? params.max as int : 5
        def offset = params.offset ? params.offset as int : 0
        List things = []

        if(profil.typ == 'Aggregate'){
            List profiles = profil.profiles?.collect { Profil.collection.findOne(_id:it.id) }
            profiles.each() { pr ->
                if(pr) {
                    things+= Things.findAllByProfil(pr as Profil,[max: max,offset: offset,  sort: 'dtCreated', order: 'desc']) 
                }
            } 
            things.sort{a,b-> b.dtCreated<=>a.dtCreated}
        }else{

            things = Things.findAllByProfil(profil,[max: max, offset: offset, sort: 'dtCreated', order: 'desc'])
        }
        [profil: profil, things: things, thingsCount: things.size()]
    }

但是这种方式我对每个关联的配置文件使用offsetandmax多次,所以结果列表太大了。

不幸的是,结果设计应该保持不变,所以assert params.max == 5 && profil.typ == "Aggregate",第一页的结果是一个包含所有配置文件的 5 个最新内容的列表(因为我将它们全部放在一个列表中并按 dtCreated 对它们进行排序)和我的问题也许:如何将相同的切片逻辑应用于聚合列表(以及如何以高效的方式聚合事物)

解决这个问题的最佳方法是什么?

提前感谢任何提示

4

3 回答 3

2

我认为这在很大程度上取决于您希望如何在视图上显示结果。在聚合模式下,您对每个配置文件的事物数量进行了分页逻辑,但我猜想乘以结果的是关联配置文件的数量。因此,您需要对关联配置文件的数量使用某种分页。

这就是为什么我要问你想如何显示你的结果,因为这应该驱动设计。

假设您处于聚合模式。假设您有一个显示所有聚合配置文件的屏幕,到这里为止您需要一个分页,目前您没有,然后如果用户单击每个配置文件向他们显示事物的结果,则需要另一个分页机制,您已经拥有.

再次根据您的设计,您可能希望将配置文件列表与其事物列表分开。用不同的动作来对你的结果进行切片(分页)。在您当前在聚合模式下的设计中,问题在于things.size() == profiles.count * max您现在无法控制配置文件的大小。

希望这有帮助

于 2013-06-23T13:05:04.987 回答
2

首先,我想扩展一下 rcgeorge23 ​​所说的,你最好让 gorm/database 处理你的聚合。Grails 文档的第 6 节将带您走很长一段路。

在您的特定情况下,您可以简单地将内置比较器与您的 `findAllBy 一起使用来处理您的聚合,这是一个具体示例:

if(profil.typ == 'Aggregate'){
  List profiles = //some code to get a list of profiles
  def things = Things.findAllByProfilInList(profiles, [max: max....order: 'desc'])
} else {
  ...
}    

其次,你对分页的使用有点不对劲。thingsCount 在技术上应该是一个与您的条件匹配的简单“选择计数”,但您返回的匹配条件受“最大值”限制。所以使用以下的 thingsCount

def thingsCount = Things.countByProfilInList(profiles) //for all things with aProfile in list
 or
def thingsCount = Things.countByProfil(aProfile) //for all things with aProfile
于 2013-06-23T17:20:37.583 回答
1

我认为理想情况下,您希望profil.typ == 'Aggregate'使用标准构建器、HQL 或 SQL 或它们的某种组合来表达您的查询,这意味着您让数据库而不是您的应用程序来完成工作。这也意味着maxandoffset可以正常工作。

我不知道您的模型是什么样的,但我认为您可以通过在sqlRestriction块内使用 SQL 子选择来做您想做的事情。在网上很难找到重要的例子,但这里的文档会让你开始。

于 2013-06-23T14:25:55.957 回答