2012-01-07 5 views
5

Grails는 모든 도메인 클래스에서 삭제를 허용하지 않는 쉬운 방법이 있습니까? 오히려 무언가가 삭제 될 때마다 업데이트되는 각 도메인에 삭제 플래그가 있어야합니다.삭제 대신 Grails 업데이트

사실, 모든 list/show 메소드는 delete 플래그가 true 인 객체를 나타내지 않아야합니다.

나는 모든 컨트롤러에서 모든 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

모든 도메인 클래스의 삭제 및 목록 메소드를 ovveride해야합니다. 부트 스트랩에 다음과 같은 코드를 추가하십시오.

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

+0

좋은 지적. 또한 기본 삭제 메소드가 수정 된 도메인 클래스에서 hardDelete와 같은 새 메소드를 만드는 것이 좋습니다. –

+0

좋은 아이디어. 또한 위에서 언급 한 정적 속성보다는 삭제 된 속성의 존재 여부 만 확인하면됩니다. 이것은 쉽게 Grails 플러그인으로 바뀔 수 있습니다. 소프트 삭제라고 부릅니다. – erturne

관련 문제