2012-01-07 9 views
5

C'è un modo semplice in Grails di non consentire l'eliminazione per qualsiasi classe di dominio? E piuttosto avere un flag di cancellazione in ogni dominio che viene aggiornato ogni volta che qualcosa viene eliminato.Aggiornamento di Grails invece di eliminare

Inoltre, in effetti tutti i metodi elenco/mostra non devono mostrare oggetti in cui il flag di cancellazione è vero.

So che posso farlo modificando manualmente tutti i miei metodi CRUD in tutti i controller ma sembra un po 'troppo lavoro quando si lavora con Grails dove tutto può essere fatto cambiando qualche bandiera da qualche parte !!

Il mio solito metodo di elenco sembra il seguente, quasi tutti i metodi di elenco nel mio progetto consentono all'utente di accedere a cose che appartengono solo alla compagnia degli utenti.

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

risposta

11

Dovrai ovviare ai metodi di eliminazione ed elenco di tutte le classi di dominio. Aggiungere il codice come questo per il vostro Bootstrap

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

mi piace questa soluzione, anche se vorrei anche aggiungere una proprietà statica per le classi di dominio che voglio questo comportamento, e sovrascrivere solo cancellare e lista per le classi che hanno il set di proprietà al vero In questo modo puoi ancora avere istanze di classi di dominio che vengono davvero eliminate. – erturne

+0

buon punto. Inoltre, probabilmente ha senso creare un nuovo metodo come hardDelete nelle classi di dominio che hanno modificato il metodo di eliminazione predefinito. –

+0

Buona idea. inoltre, piuttosto che una proprietà statica come ho detto sopra, basta cercare l'esistenza della proprietà cancellata. Questo potrebbe facilmente essere trasformato in un plugin Grails. Chiamalo soft-delete. – erturne

Problemi correlati