как реализовать софт удаляет - PullRequest
2 голосов
/ 19 января 2012

Может кто-нибудь сказать мне, что было бы хорошим способом для осуществления мягкого удаления? У меня может быть свойство deleted в моем классе, но мой вопрос заключается в том, как легко игнорировать экземпляры, которые имеют deleted = true в моих поисках, списках и т. Д.

Таким образом, вместо того, чтобы говорить Domain.findByDeleted(true), просто заставить Domain.list() игнорировать удаленные экземпляры, вместо того, чтобы сказать Domain.findByPropertyAndDeleted('property', true), просто сказать Domain.findByProperty('property').

Есть ли хороший способ сделать это?

Ответы [ 3 ]

7 голосов
/ 19 января 2012

Я бы порекомендовал использовать для этого именованный запрос . Что-то вроде

static namedQueries = {
    notDeleted {
        ne 'deleted', true
    }
}

который вы можете использовать как Domain.notDeleted.list() или Domain.notDeleted.findByProperty(value)

1 голос
/ 19 января 2012

Плагин фильтра гибернации может автоматически добавлять предикат deleted = false к каждому запросу, который выполняется для определенного класса домена. Однако мои тесты показали, что этот плагин не работает с Grails 2.0.0.

0 голосов
/ 19 января 2012

Мы привыкли переопределять list(), get() и некоторые другие методы классов доменов. Теперь мы можем использовать синтаксис вроде A.delete(log: true)

На начальной загрузке мы делаем:

grailsApplication.domainClasses.each { GrailsDomainClass domainClassInfo ->
    def oldGormDelete = domainClassInfo.metaClass.getMetaMethod('delete', [] as Class[])
    assert oldGormDelete
    domainClassInfo.metaClass.delete = { Map params ->
        ...
        def result = oldGormDelete.invoke(delegate)
        ...
    }
}
...