【问题标题】:Grails update instead of deleteGrails 更新而不是删除
【发布时间】:2012-02-04 19:32:11
【问题描述】:

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() ]
}

【问题讨论】:

    标签: grails grails-orm grails-controller


    【解决方案1】:

    您必须覆盖所有域类的删除和列出方法。将这样的代码添加到您的引导程序中

    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 = {}
    }
    

    【讨论】:

    • 我喜欢这个解决方案,虽然我也会向我想要此行为的域类添加一个静态属性,并且只覆盖属性设置为 true 的类的删除和列表。这样,您仍然可以拥有真正被删除的域类实例。
    • 好点。此外,在修改了默认删除方法的域类上创建一个像 hardDelete 这样的新方法可能是有意义的。
    • 好主意。另外,不是我上面提到的静态属性,而是查找已删除属性的存在。这可以很容易地变成一个 Grails 插件。称之为软删除。
    • @AnujArora 如果您碰巧将它托管在某个地方,您可以在此处发布链接吗?
    • @AnujArora 一个问题 Anuj,即使我在控制器中更改了列表方法,它们也能正常工作吗?例如,我当前的应用程序在默认列表方法中添加了一些条件来按登录用户进行过滤,在这种情况下,它会自动按我的条件以及 deleteflag 过滤数据吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2012-02-13
    • 2022-11-03
    相关资源
    最近更新 更多