Как передать неявный параметр в Closure в Grails? - PullRequest
0 голосов
/ 27 апреля 2019

У меня много запросов с одинаковой логикой, и я решил извлечь их в замыкание.

Вот пример:

Closure whereByProjectIdAndUser = { Criteria cr, Long projectId, User user ->
    Long userId = user.id
    Boolean isReviewer = user.isReviewer()

    cr.isNull 'project.deletedAt'
    cr.eq 'project.id', projectId

    (cr | {
        cr.eq 'owner.id', userId

        if (isReviewer) {
            cr & {
                cr.eq 'reviewer.id', userId
                cr.ne 'project.certificationStatus', ProjectCertificationStatus.None
            }
        }
    })
}

@Transactional(readOnly = true)
RrmUtilization[] getAllByProjectIdAndUser(Long projectId, User user) {

    BuildableCriteria cr = RrmUtilization.createCriteria()
    RrmUtilization[] result = cr.list {
        createAlias('project', 'project', JoinType.INNER_JOIN)
        createAlias('project.owner', 'owner', JoinType.INNER_JOIN)
        createAlias('project.reviewer', 'reviewer', JoinType.LEFT_OUTER_JOIN)

        isNull 'deletedAt'

        whereByProjectIdAndUser(cr, projectId, user)

    } as RrmUtilization[]

    result
}

Это работает просто отлично, однако я былпытаясь понять, как я могу избежать явной передачи BuildableCriteria в замыкание?Есть ли способ, чтобы неявно пройти через него и получить более приятный код?

Может быть, есть какие-то лучшие подходы в целом?

1 Ответ

0 голосов
/ 30 апреля 2019

Вы можете использовать ключевое слово this для доступа к параметрам в классе включения замыкания.

Groovy документация: http://groovy -lang.org / closures.html # closure-owner

...