2012-01-07 82 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