2012-01-19 3 views
2

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

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

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

+0

Это должно помочь вам: http://stackoverflow.com/questions/8768534/grails-update-instead-of-delete/8768728 –

ответ

7

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

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

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

0

Мы привыкли переопределить 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) 
     ... 
    } 
} 
+0

Это второй раз, когда я столкнулся с этой стратегией. Я не слишком хорошо знаком с мета-программированием Грайля. Не могли бы вы объяснить, что здесь происходит, вызывая делегата? – gotomanners

+1

Я использую метапрограммирование Groovy (см. Http://groovy.codehaus.org/JN3525-MetaClasses, раздел «ExpandoMetaClass»). В свойстве класса 'metaClass' я назначаю замыкания, которые нужно вызывать вместо определенных сигнатур методов, в примере - статический метод 'delete (Map params). 'delegate' является ключевым словом Groovy, таким как' this' и 'owner', что означает объект, который замыкание называется как метод - см. http://groovy.codehaus.org/Closures. 'invoke()' is, er, 'Closure' метод для его выполнения с заданным' this' и заданным списком аргументов - параметры после первого будут использоваться в качестве аргументов вызова. –

1

hibernate filter plugin может автоматически добавить предикат deleted = false для каждого запроса, который выполняется для определенного класса домена. Тем не менее, мое тестирование показало, что этот плагин не работает с Grails 2.0.0.

+0

Самый чистый ответ. –

Смежные вопросы