2012-01-19 112 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