【问题标题】:how to implement soft deletes如何实现软删除
【发布时间】:2012-01-19 00:36:14
【问题描述】:

谁能告诉我什么是实现软删除的好方法?我可以在我的班级中有一个deleted 属性,但我的问题是如何轻松地忽略在我的搜索、列表等中具有deleted = true 的实例。

因此,与其说Domain.findByDeleted(true),不如让Domain.list() 忽略已删除的实例,而不是说Domain.findByPropertyAndDeleted('property', true),直接说Domain.findByProperty('property')

有什么好的方法吗?

【问题讨论】:

标签: grails grails-orm grails-domain-class


【解决方案1】:

我建议为此使用named query。类似的东西

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

你可以使用 Domain.notDeleted.list()Domain.notDeleted.findByProperty(value)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我们习惯于覆盖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)
              ...
          }
      }
      

      【讨论】:

      • 这是我第二次遇到这种策略。我对 grails 元编程不太熟悉,请您解释一下这里发生了什么,调用委托?
      • 我正在使用 Groovy 元编程(参见 groovy.codehaus.org/JN3525-MetaClasses,“ExpandoMetaClass”部分)。在 Class 的 metaClass 属性中,我分配要调用的闭包而不是某些方法签名,在示例中 - 静态 delete(Map params) 方法。 delegate 是一个 Groovy 关键字,类似于 thisowner,这意味着闭包作为方法调用的对象 - 请参阅 groovy.codehaus.org/Closuresinvoke() 是,呃,Closure 使用给定的this 和给定的参数列表执行它的方法 - 第一个参数之后的参数将用作调用参数。
      猜你喜欢
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 2013-02-04
      • 2019-04-20
      • 1970-01-01
      相关资源
      最近更新 更多