Является ли модель в вашем вопросе вашей реальной моделью или ее упрощенной версией? Если все, что вы делаете, это действия пользователя hasMany, и каждое действие имеет точечное значение (целое число?), Которое вы хотите суммировать, то это действительно то, в чем превосходные реляционные базы данных. Если у вас есть правильные индексы в вашей базе данных, я думаю, это будет очень быстрый вызов, если вы выполняете запрос groupBy (или используете критерии проекции grails).
Вот пример метода, который возьмет список пользователей и вернет массив, который соединяет user.id с количеством точек, которые пользователь имеет в данный момент:
def calculateCurrentPoints(users) {
Action.executeQuery('select a.user.id, sum(points) from Action a where a.user.id in (:userIds) group by a.user.id', [userIds: users.id])
}
При желании вы можете легко превратить это в карту с идентификатором пользователя в точках для более удобного поиска:
def calculateCurrentPoints(users) {
def result = Action.executeQuery('select a.user.id, sum(points) from Action a where a.user.id in (:userIds) group by a.user.id', [userIds: users.id])
result.inject([:]) { map, userWithPoints ->
map[userWithPoints[0]] = userWithPoints[1]
return map
}
}
Если это действительно медленнее, чем я думаю, вы можете использовать executeUpdate с HQL, аналогичным приведенному выше, чтобы обновить поле «totalPoints» для каждого пользователя (или сохранять его обновленным как часть службы всякий раз, когда вы добавляете новое действие для этого пользователя).