`After_create` और` after_save` के बीच क्या अंतर है और कब उपयोग करना है?


124

कर रहे हैं after_createऔर after_saveप्रति कार्यक्षमता के रूप में ही?

मैं अपने खाते के निर्माण के बाद एक उपयोगकर्ता के ईमेल के साथ एक ऑपरेशन करना चाहता हूं।

डेटाबेस में सहेजे जाने पर मैं वह ऑपरेशन करना चाहता हूं।

जो उपयोग करने के लिए बेहतर है: after_createया after_save?

जवाबों:


212

after_create केवल एक बार काम करता है - रिकॉर्ड बनने के तुरंत बाद।

after_save हर बार जब आप ऑब्जेक्ट को सहेजते हैं तो काम करता है - भले ही आप इसे कई साल बाद अपडेट कर रहे हों

इसलिए यदि आप इस ईमेल ऑपरेशन को केवल एक बार करना चाहते हैं (और फिर कभी नहीं) तो उपयोग करें after_create

यदि आप हर बार वस्तु को सहेजना चाहते हैं, तो इसे करेंafter_save


2
पाठकों को ध्यान रखना चाहिए कि डॉक्स के अनुसार , ActiveRecord update_allकिसी भी कॉलबैक को आमंत्रित नहीं करता है, जिसमें शामिल हैंafter_*
user2426679

93

से डॉक्स :

after_create()

Base.saveनई वस्तुओं के बाद कहा जाता है जो अभी तक सहेजे नहीं गए हैं (कोई रिकॉर्ड मौजूद नहीं है)।

after_save()

के बाद कहा जाता है Base.save (इस बात की परवाह किए बिना कि क्या इसे बनाने या अपडेट को सहेजना है)।


1
after_save()

ठीक काम करता है जब आपको उन मॉडलों को सहेजना होता है जो बहुत बार नहीं बचाते हैं। बार-बार रिकॉर्ड बदलने के इस विशेष उदाहरण के लिए इसका उपयोग करना उचित होगा

 after_commit()

सुनिश्चित करें कि कार्रवाई के बाद कार्रवाई निष्पादित होने से पहले मॉडल को डेटाबेस में सहेजा गया है :_commit: गणना_credit_score

def calculate_credit_score
     #Call a Cron job
end

आप उपयोग करने की सलाह देते हैं after_commitलेकिन समझाते क्यों नहीं। क्या आप विस्तृत कर सकते हैं? ध्यान दें कि after_commitबनाएँ, updat और नष्ट पर चलता है। डॉक्स: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/… तो यह वैसा ही व्यवहार नहीं है जैसा कि after_saveआप वास्तव में रिकॉर्ड को नष्ट करने के बाद उस क्रोन_जॉब को कॉल करना चाहते हैं? या ऑप्स मामले में, अब हटाए गए उपयोगकर्ता को एक ईमेल भेजें? उपयोग करने में सावधानी बरतेंafter_commit
rmcsharry

after_commitउन CRUD ऑपरेशनों पर चलता है, इसलिए यदि उनके मामले में ईमेल अक्सर अपडेट किया जाता है, तो एक विशेष कॉलबैक के लिए कार्रवाई को संयोजित करना आसान होगा। मेरे मामले में मैंने इस्तेमाल कियाafter_commit : calculate_profile_update, on: :update
pensebien
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.