2012-06-03 11 views
7

Esiste un metodo valido/standard per eseguire codice comune prima di ogni chiamata save() nelle classi di dominio?Grails: come eseguire il codice prima di ogni salvataggio?

Per esempio, il mio dominio

class Page { 

    String url 
    Boolean processed 
    Date date 
    Integer urlCrc 
} 

La mia forma ha solo 3 primi campi e vorrei calcolare urlCrc ogni volta che il metodo viene chiamato save(). Non riesco solo a sovrascrivere il metodo di salvataggio perché è stato iniettato.

risposta

16

È possibile utilizzare eventi GORM - vedere docs. Dal momento che per impostazione predefinita validate() viene chiamato prima di ogni save() lo userei.

class Page { 
    //your defs here 

    def beforeValidate() { 
     this.urlCrc = yourComputationHere 
    } 
} 
+0

Grazie, funziona. Purtroppo grails.org non funziona, a causa di alcuni problemi di routing http://grails.1312388.n4.nabble.com/Is-the-plugin-repository-down-td4628824i40.html quindi avevo bisogno di chiedere qui – mrok

+0

Quanto sopra la soluzione è probabilmente la migliore, ma un'altra opzione consiste nell'utilizzare un campo calcolato per i graal. Vedi i documenti per quello. –

+1

Se si desidera eseguire il codice prima del salvataggio, usare 'beforeUpdate()/beforeInsert()'. se usi 'beforeValidate()' che viene chiamato sempre quando chiami 'validate()' (metodo 'save()' chiama 'validate()' prima di salvare). Quindi il tuo codice è eseguito prima di convalidarlo anche se non lo salvi. – IgniteCoders

1
class Page { 
    def beforeInsert() { 
     this.beforeUpdate() 
    } 
    def beforeUpdate() { 
     this.urlCrc = 'calculate something' 
    } 
} 
+1

puoi collegarti alla documentazione su questo? – dopatraman

+0

Sì, questa è la [documentazione] (http://docs.grails.org/1.3.6/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.5% 20Advanced% 20GORM% 20Caratteristiche) – IgniteCoders