2012-01-19 99 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 – 2012-01-19 19:35:11

回答

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

这是我第二次遇到这种策略。我对grails元编程不太熟悉,你能解释一下这里发生了什么,调用委托吗? – gotomanners 2012-01-19 13:06:04

+1

我正在使用Groovy元编程(请参阅http://groovy.codehaus.org/JN3525-MetaClasses,“ExpandoMetaClass”部分)。在类'metaClass'属性中,我将分配闭包来调用,而不是特定的方法签名,在这个例子中是静态的'delete(Map params)'方法。 'delegate'是Groovy关键字,比如'this'和'owner',意思是闭包被调用的方法 - 参见http://groovy.codehaus.org/Closures。 'invoke()'是,呃''Closure'的方法,用给定的'this'和给定的参数列表来执行它 - 第一个参数之后的参数将被用作调用参数。 – 2012-01-19 15:26:20

1

hibernate filter plugin可以断言deleted = false自动添加到为特定域类执行每个查询。但是,我的测试表明,该插件不适用于Grails 2.0.0。

+0

现在是最干净的答案。 – 2012-01-19 15:31:02