जाँच करें कि क्या रिकॉर्ड सिर्फ रेल में नष्ट हो गया था


83

इसलिय वहाँ है

record.new_record?

यह जांचने के लिए कि क्या कुछ नया है

मुझे यह जांचने की ज़रूरत है कि क्या कुछ बाहर है।

record = some_magic
record.destroy
record.is_destroyed? # => true

ऐसा कुछ। मुझे पता है कि वस्तु को नष्ट कर दिया गया है, तो जमे हुए? कार्यों की तरह, लेकिन क्या इस कार्य के लिए स्पष्ट रूप से कुछ है?

जवाबों:


50

तुम यह केर सकते हो।

Record.exists?(record.id)

हालाँकि यह उस डेटाबेस पर एक हिट करेगा जो हमेशा आवश्यक नहीं होता है। केवल एक अन्य उपाय जो मुझे पता है कि एक कॉलबैक करना है जैसा कि उल्लेख किया गया है।

attr_accessor :destroyed
after_destroy :mark_as_destroyed
def mark_as_destroyed
  self.destroyed = true
end

और फिर जांचें record.destroyed


2
मुझे लगता है कि कुछ संदर्भ यहां सहायक हैं। यह इस बात पर निर्भर करता है कि आप यह जानना चाहते हैं कि कोई वस्तु नष्ट हो गई है या नहीं। यदि आप इसे एक इकाई परीक्षण के हिस्से के रूप में कर रहे हैं, तो डेटाबेस के खिलाफ अतिरिक्त हिट ठीक है। यदि आप इसे ऐप के हिस्से के रूप में कर रहे हैं, तो दूसरा मार्ग बेहतर शर्त हो सकता है।
१६:०६ पर जेरहिस्मिथ २

69
यह अब जरूरी नहीं है, उपयोग करेंobject.destroyed?
रोब

2
रेल 4 में, DEPRECATION WARNING: You are passing an instance of ActiveRecord::Base to मौजूद है? . Please pass the id of the object by calling .id.
मिनिक पैन

5
अभी भी Record.exists?कंट्रोलर स्पेक्स की जरूरत है, क्योंकि मैं नष्ट रिकॉर्ड को फिर से लोड नहीं कर सकता अगर यह है destroyed?। लेकिन अगर मेरे पास जांच के लिए उदाहरण चर है assings, तो मैं उपयोग कर सकता हूं destroyed?
denis.peplin

@ डैनियल हाकस्टेप, यदि आप अभी भी जीवित हैं, तो कृपया, सही उत्तर के लिए स्वीकृत उत्तर को बदल दें!
डैनियल


11

यह बहुत जल्द आ रहा है। नवीनतम राइडिंग रेल पोस्ट में, यह कहता है:

और अंत में, यह जरूरी नहीं कि बगमैश-संबंधी हो, लेकिन जोस वैलिम - दर्जनों अन्य कमिट्स में - model.destroyed जोड़ा। यह निफ्टी विधि केवल तभी सही होगी जब आप वर्तमान में देख रहे उदाहरण को सफलतापूर्वक नष्ट कर दिया गया हो।

तो यह तूम गए वहाँ। जल्द आ रहा है!


6

जबकि record.destroyed? ठीक काम करता है, और सही या गलत होने पर वापसी करता है, आप इसे थोड़ा सा भी ड्राय कर सकते हैं और यदि आप अपने कंट्रोलर में जिस कॉल को नष्ट करते हैं उस लाइन पर यदि यह स्थिति है।

record = Object.find(params[:id])
if record.destroy
  ... happy path
else
  ... sad path
end

इस पद का एहसास खेल में थोड़ा देर से होता है। लेकिन किसी को भी इस पर चर्चा करना चाहिए, मैं खेल रहा हूँ! साइड नोट: मेरे पास अपने मॉडल पर after_destroy सत्यापन भी था और जब यह काम करता था, तो इस तरह से कुछ के लिए एक अलग विधि ओवरकिल जैसा लगता है;)


5

destroyआईएनजी एक कॉल के अलावा किसी भी वस्तु को वापस नहीं करता freeze(जहाँ तक मुझे पता है) तो मुझे लगता frozen?है कि यह आपकी सबसे अच्छी शर्त है। ActiveRecord::RecordNotFoundयदि आप कुछ पसंद करते हैं तो आपका अन्य विकल्प बचाव करना है record.reload

मुझे लगता है कि ऊपर माइक की रणनीति सबसे अच्छी हो सकती है, या आप इन मामलों के लिए एक रैपर लिख सकते हैं यदि आप 'धारणा बनाना' शुरू करना चाहते हैं।

चीयर्स।


मैं वर्तमान में बस जमे हुए की जांच करता हूं?, लेकिन वास्तव में मैं कुछ लोड कर सकता हूं और इसे किसी अन्य उद्देश्य के लिए फ्रीज कर सकता हूं, और यह एक झूठ होगा ... वर्तमान स्थिति में, जमे हुए? ठीक काम करता है, लेकिन मैं इस पर लंबे समय तक भरोसा नहीं करना चाहता।
डैनियल हाकस्टेप

0

आपके ऐप के तर्क को अधिक जाने बिना, मुझे लगता है कि जमे हुए? तुम्हारा सबसे अच्छा दांव है।

असफल होने पर, आप निश्चित रूप से अपने मॉडल में एक "नष्ट" विशेषता जोड़ सकते हैं जिसे आप कॉलबैक में ट्रिगर करते हैं और अगर आप अधिक सटीक समाधान चाहते हैं तो इसके खिलाफ जांच की जा सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.