2012-06-03 10 views
7

डोमेन कक्षाओं पर प्रत्येक save() आमंत्रण से पहले कुछ सामान्य कोड निष्पादित करने का कोई अच्छा/मानक तरीका है?Grails - प्रत्येक सहेजने से पहले कोड कैसे निष्पादित करें?

उदाहरण के लिए, मेरे डोमेन

class Page { 

    String url 
    Boolean processed 
    Date date 
    Integer urlCrc 
} 

मेरे प्रपत्र केवल 3 पहले फ़ील्ड होते हैं और मैं urlCrc हर बार save() विधि कहा जाता है की गणना करना चाहते हैं। मैं केवल सहेजने की विधि को ओवरराइड नहीं कर सकता क्योंकि यह इंजेक्शन दिया गया है।

उत्तर

16

आप GORM ईवेंट का उपयोग कर सकते हैं - docs देखें। चूंकि डिफ़ॉल्ट रूप से validate() प्रत्येक save() से पहले कहा जाता है, मैं इसका उपयोग करूंगा।

class Page { 
    //your defs here 

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

धन्यवाद, यह काम करता है। दुर्भाग्यवश grails.org नीचे है, कुछ रूटिंग समस्याओं के कारण http://grails.1312388.n4.nabble.com/Is-the-plugin-repository-down-td4628824i40.html इसलिए मुझे यहां पूछने की आवश्यकता है – mrok

+0

उपरोक्त समाधान शायद सबसे अच्छा है, लेकिन एक और विकल्प एक grails गणना क्षेत्र का उपयोग करना है। इसके लिए दस्तावेज़ देखें। –

+1

यदि आप सहेजने से पहले कोड को पहले से अपडेट करें()/पहले इंसर्ट() 'से पहले निष्पादित करना चाहते हैं। यदि आप 'preValidate()' का उपयोग करते हैं, तो इसे हमेशा सत्यापित किया जाता है जब आप 'वैध() '(विधि' सेव() 'कॉल' मान्य() 'को सहेजने से पहले कॉल करते हैं) कहते हैं। तो यदि आपका कोड सहेजता नहीं है तो भी आपका कोड इसे सत्यापित करने से पहले निष्पादित किया जाता है। – IgniteCoders

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

क्या आप इस पर प्रलेखन से लिंक कर सकते हैं? – dopatraman

+0

हां, यह [प्रलेखन] है (http://docs.grails.org/1.3.6/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.5% 20 उन्नत% 20GORM% 20 विशेषताएं) – IgniteCoders