2012-01-07 81 views
5

Grails中有没有简单的方法来禁止删除任何Domain Class?而是在每个域中删除标志,每当删除某些内容时都会更新。Grails更新而不是删除

此外,有效的所有列表/显示方法不应该显示的对象,其中删除标志为真。

我知道我能做到这一点通过手动编辑在所有控制器我所有的CRUD方法,而是使用Grails这里的一切可以改变的地方一些标志来完成工作时,似乎有点太辛苦了!

我通常列表方法看起来像以下,几乎在我的项目中的所有列表方法,您可以只属于用户的公司用户访问的事情。

def list = { 
    params.max = Math.min(params.max ? params.int('max') : 10, 100) 
    def documentsList = Documents.createCriteria().list(params){ 
     eq("company.id",session.companyId) 
     maxResults(params.max) 
     order("dateCreated","desc") 
     //firstResult(params.offset) 
    } 
    [documentsInstanceList: documentsList , documentsInstanceTotal: documentsList.getTotalCount() ] 
} 

回答

11

您必须将所有域类的删除和列表方法包含在内。加入这样的代码到你的引导

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 

    for (dc in grailsApplication.domainClasses) { 

    dc.clazz.exists(-1); //to register meta class 

    def gormSave = dc.clazz.metaClass.getMetaMethod('save');   
    dc.clazz.metaClass.delete = { -> 
     delegate.deleted = true 
     gormSave.invoke delegate 
    } 

    dc.clazz.metaClass.delete = { Map args -> 
     delegate.deleted = true 
     gormSave.invoke(delegate, args) 
    } 

    dc.clazz.metaClass.static.list = { -> 
     def crit = delegate.createCriteria(); 
     def list = crit.list{ 
      eq('deleted', false) 
     } 
     return list; 
    } 



    } 
} 

    def destroy = {} 
} 
+1

我喜欢这样的解决方案,但我也想一个静态属性添加到我想这种行为域类,并且只覆盖删除和列表具有属性集类为真。这样,您仍然可以拥有真正被删除的域类的实例。 – erturne 2012-01-07 12:06:20

+0

好点。另外,在修改了缺省删除方法的域类上创建一个像hardDelete这样的新方法可能是有意义的。 – 2012-01-07 14:24:05

+0

好主意。此外,而不是像我上面提到的静态属性,只需查找已删除属性的存在。这可以很容易地变成一个Grails插件。称它为软删除。 – erturne 2012-01-07 14:36:28