2011-05-09 12 views
6

मेरे पास एक डोमेन क्लास है जिसके लिए इसे अपने किसी एक फ़ील्ड में बनाया जाने वाला दिन होना चाहिए।Grails: क्या मैं केवल एक वैध (0 अपडेट नहीं/संपादित कर सकता हूं)

class myClass { 
    Date startDate 
    String iAmGonnaChangeThisInSeveralDays 
    static constraints = { 
    iAmGonnaChangeThisInSeveralDays(nullable:true) 
    startDate(validator:{ 
     def now = new Date() 
     def roundedDay = DateUtils.round(now, Calendar.DATE) 
     def checkAgainst 
     if(roundedDay>now){ 
      Calendar cal = Calendar.getInstance(); 
      cal.setTime(roundedDay); 
      cal.add(Calendar.DAY_OF_YEAR, -1); // <-- 
      checkAgainst = cal.getTime(); 
     } 
     else checkAgainst = roundedDay 

     return (it >= checkAgainst) 
    }) 
    } 
} 

तो कई दिन बाद जब मैं केवल स्ट्रिंग बदल सकते हैं और बचाने के लिए बचाने में विफल रहता है क्योंकि सत्यापनकर्ता तारीख फिर से चेक कर रहा है कहते हैं और यह अतीत में है। क्या मैं केवल निर्माता बनाने के लिए सत्यापनकर्ता को आग लगाने के लिए सेट कर सकता हूं, या क्या मैं इसे बदलने के लिए कुछ तरीकों से बदल सकता हूं यह पता लगाने के लिए कि क्या हम बना रहे हैं या संपादन/अपडेट कर रहे हैं?

@Rob एच मुझे पूरी तरह से यकीन नहीं है कि आपके उत्तर का उपयोग कैसे करें। मेरे पास निम्न त्रुटि है जिसके कारण यह त्रुटि है:

myInstance.iAmGonnaChangeThisInSeveralDays = "nachos" 
myInstance.save() 
if(myInstance.hasErrors()){ 
    println "This keeps happening because of the stupid date problem" 
} 
+0

यह कभी ऐसा होता है कि 'startDate' के बाद अद्यतन किया जाता होगा प्रारंभिक बचत? –

+0

कभी नहीं बदला जाना चाहिए। – Mikey

उत्तर

12

आप देख सकते हैं id कि क्या यह एक नया गैर लगातार उदाहरण है का एक संकेतक या एक मौजूदा लगातार उदाहरण के रूप में सेट किया गया है:

startDate(validator:{ date, obj -> 
    if (obj.id) { 
     // don't check existing instances 
     return 
    } 
    def now = new Date() 
    ... 
} 
+0

यह वही है जो मुझे चाहिए + बल्कि एक अच्छा हैक। – Mikey

0

एक विकल्प यह निर्दिष्ट करना हो सकता है कि आप कौन से गुणों को सत्यापित करना चाहते हैं। documentation से:

The validate method accepts an optional List argument which may contain the names of the properties that should be validated. When a List is passed to the validate method, only the properties defined in the List will be validated.

उदाहरण:

// when saving for the first time: 
myInstance.startDate = new Date() 
if(myInstance.validate() && myInstance.save()) { ... } 

// when updating later 
myInstance.iAmGonnaChangeThisInSeveralDays = 'New Value' 
myInstance.validate(['iAmGonnaChangeThisInSeveralDays']) 
if(myInstance.hasErrors() || !myInstance.save(validate: false)) { 
    // handle errors 
} else { 
    // handle success 
} 

यह एक सा hacky लगता है जब से तुम कुछ में निर्मित Grails अच्छाई को दरकिनार कर रहे हैं। आप सावधान रहना चाहेंगे कि आप डोमेन पर किसी भी आवश्यक सत्यापन को बाईपास नहीं कर रहे हैं जो आमतौर पर होता है यदि आप केवल save() पर कॉल करते हैं। यदि अधिक सुरुचिपूर्ण हैं तो मुझे दूसरों के समाधान देखने में दिलचस्पी होगी।

नोट: मैं वास्तव में यदि आप इसे से बचने कर सकते save(validate: false) उपयोग करने की अनुशंसा नहीं करते। जब तक आप इसका उपयोग नहीं करते हैं, तब तक आप बहुत सावधान रहें जब तक कि आप सड़क पर कुछ अप्रत्याशित नकारात्मक नतीजे न दें। यदि आप एक विकल्प पा सकते हैं, तो हर जगह इसका इस्तेमाल करें।

+0

पूरी तरह से यह सुनिश्चित नहीं है कि इसका उपयोग कैसे करें; कृपया मेरे मूल प्रश्न में मेरा संपादन देखें। – Mikey

+1

@ माइकी - मेरा जवाब अपडेट किया गया। मुझे यह सुनिश्चित करने के लिए एक त्वरित परीक्षण चलाने की ज़रूरत है कि यह सही है। यदि नहीं, तो इसे पहले से ही करने के बाद 'मान्य()' को कॉल करने वाले Grails से बचने के लिए 'सहेजें (मान्य: झूठा)' का उपयोग करने के लिए अपडेट किया जा सकता है। –

+0

@ माइकी - कुछ परीक्षण करने के बाद एक और अपडेट किया। शायद यह आपके लिए काम करेगा। –

संबंधित मुद्दे