2009-10-19 19 views
71

मैं मॉडल में सहेजे जाने के बाद निष्पादित रेल में कॉलबैक फ़ंक्शन बनाना चाहता हूं।मॉडल से विशेषता परिवर्तन का पता लगाने के लिए कैसे?

मैं इस मॉडल, दावा एक विशेषता 'स्थिति' जो दावे की स्थिति के आधार पर, संभावित मान लंबित हैं, का समर्थन किया, अनुमोदित बदल जाता है, को अस्वीकार कर दिया है

डेटाबेस डिफ़ॉल्ट के साथ 'राज्य' है 'लंबित' का मूल्य।

मैं मॉडल को पहली बार बनाया गया है या एक राज्य से दूसरे राज्य में अपडेट किए जाने के बाद कुछ कार्य करना चाहता हूं, इस पर निर्भर करता है कि यह किस राज्य से बदलता है।

after_save :check_state 

    def check_state 
     # if status changed from nil to pending (created) 
     do this 

     # if status changed from pending to approved 
     performthistask 
    end 

मेरे सवाल यह है कि मैं मॉडल के भीतर परिवर्तन करने से पहले पिछले मूल्य के लिए जाँच करते है:

मेरा विचार मॉडल में एक समारोह के लिए है?

उत्तर

148

आप ActiveModel::Dirty मॉड्यूल पर गौर करना चाहिए: आप अपने दावे मॉडल पर निम्नलिखित कार्रवाई करने के लिए सक्षम होना चाहिए:

claim.status_changed? # returns true if 'status' attribute has changed 
claim.status_was  # returns the previous value of 'status' attribute 
claim.status_change # => ['old value', 'new value'] returns the old and 
         # new value for 'status' attribute 

claim.name = 'Bob' 
claim.changed # => ["name"] 
claim.changes # => {"name" => ["Bill", "Bob"]} 

ओह! रेल की खुशी!

+4

मॉडल सहेजे जाने के बाद यह काम नहीं करेगा, जिसे उसने पूछा था। –

+3

@ टॉमरोसी, 'गंदे' कॉल 'after_save' (रेल 2.3 और 3.x दोनों में) में काम करता है। मैंने इसे कई बार इस्तेमाल किया है। –

+8

@ टॉमरोसी, गंदे झंडे को प्रतिबद्ध करने के बाद रीसेट कर दिया जाता है, इसलिए वे रेल 3x में पेश किए गए 'after_commit' कॉलबैक में उपलब्ध नहीं होंगे। वे निश्चित रूप से 'after_save' में काम करेंगे। –

3

मैं सुझाव है कि आप उपलब्ध राज्य मशीन प्लगइन्स में से एक पर एक नजर है:

या तो एक राज्यों के बीच आप सेटअप राज्यों और संक्रमण करने देगा। अपनी आवश्यकताओं को संभालने का बहुत उपयोगी और आसान तरीका।

+0

मैं rubyist-aasm एक कोशिश दे रहा हूँ। चलें कहते हैं कि मैं वर्ग दावा है : enter_pending डीईएफ़ सूचक enter_pending।delivery_pending_notification (self) अंत अंत और मेरे डेटाबेस में मेरे स्थिति फ़ील्ड में "लंबित" का डिफ़ॉल्ट मान है। यदि मैं स्टेटस फ़ील्ड भरने के बिना दावा कर सकता हूं (ताकि वह 'लंबित' चलाएगा), क्या एएएसएम 'enter_pending' विधि चलाएगा? –

33

आप का उपयोग इस

self.changed 

यह सभी स्तंभों है कि इस रिकॉर्ड

में बदल की एक सरणी लौट सकते हैं आप भी

self.changes 

जो स्तंभों को बदल के हैश रिटर्न उपयोग कर सकते हैं और परिणामों के पहले और बाद में एरे

+4

का उपयोग करें बस यह कहने के लिए एक मामूली नोट है कि इन पर' self.' का उपयोग करना अनावश्यक है - आप बस 'बदल सकते हैं' और 'परिवर्तन'। – user664833

0

मैंने प्रश्न में वृद्धि देखी है कई जगहें, इसलिए मैंने कोड को थोड़ा अच्छा बनाने के लिए एक छोटे से रूबीगेम लिखा (और हर जगह लाखों से अधिक बयान से बचें): https://github.com/ronna-s/on_change। मुझे उम्मीद है कि मदद करता है।

0

state_machine मणि जैसे एक अच्छी तरह से परीक्षण किए गए समाधान का उपयोग करके आप बहुत बेहतर होंगे।

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