2011-05-30 19 views
7

मैं वर्तमान में रेल फ्रेमवर्क पर रुबी और रूबी सीखना शुरू कर रहा हूं। मैंने पाया कि तालिका records में, मैं 5 की एक आईडी के साथ एक रिकॉर्ड खोजने के लिए और निम्नलिखित कोड का उपयोग करके इसे हटा सकते हैं: रिकॉर्ड को खोजने के लिएमैं रेल में Record.all.destroy का उपयोग क्यों नहीं कर सकता?

Record.find(5).destroy

यह sense- मैं श्रृंखला तरीकों बनाता है और इसे नष्ट कर दो। हालांकि, अगर मैं तालिका में सभी रिकॉर्ड नष्ट करना चाहते हैं, तार्किक आदेश निम्नलिखित, होगा के रूप में all चयनकर्ता तालिका में सभी रिकॉर्ड का चयन करता है:

Record.all.destroy

और यह एक NoMethodError रिटर्न! मुझे पता है कि मैं इस कार्य को पूरा करने के लिए Record.destroy_all या Record.delete_all का उपयोग कर सकता हूं, हालांकि, मैं जानना चाहता हूं कि मैं delete_all जैसी चीज़ों को देखने के बजाय सबसे तार्किक विकल्प का उपयोग क्यों नहीं कर सकता। मैं इस ढांचे के लिए नया हूं, इसलिए यह पूरी तरह से संभव है कि मुझे यहां कुछ मौलिक याद आ रही है।

अग्रिम में किसी भी उत्तर के लिए धन्यवाद।

+0

वास्तव में एक अच्छा सवाल है, क्योंकि मैंने पहले एक ही चीज़ की कोशिश की थी ... आप 'Record.all.each {| r | r.destroy} 'निश्चित रूप से, लेकिन यह' Record.all.destroy' –

उत्तर

14

यह एक डिजाइन निर्णय था। डेटामैपर ने your approach लिया। destroy_all लिखने के लिए मजबूर होना स्पष्ट रूप से कठिन हो सकता है लेकिन आपको ऐसा कुछ भी करने से रोक देगा जो आप वास्तव में नहीं चाहते हैं (यानी किसी तालिका में सब कुछ हटाएं, जैसे x = User; ...; x.destroy)।

+0

के रूप में तार्किक नहीं है धन्यवाद- यह वह उत्तर था जिसे मैं ढूंढ रहा हूं। मुझे लगता है कि रिकॉर्ड के अनजान द्रव्यमान हटाने के खिलाफ यह अच्छी सुरक्षा हो सकती है। – element119

3

मैं मानता हूं कि यह तार्किक ऐसा करने में सक्षम होने के लिए होगा। तकनीकी रूप से बोलते हुए, Record.all एक संग्रह (या संग्रह के लिए प्रॉक्सी) देता है जो destroy विधि को लागू नहीं करता है।

1

जब आपके पास

Record.find(5) 

यह एक रिकार्ड वस्तु/उदाहरण जो आपकी सारणी के एक पंक्ति में डेटा का प्रतिनिधित्व करता देता है। फिर आप उस ऑब्जेक्ट पर #destroy विधि को कॉल करते हैं जिसे आपके रिकॉर्ड मॉडल द्वारा परिभाषित किया गया है।

यह एक सरणी ऑब्जेक्ट जब आप

Record.all 

है। फिर आप सरणी पर #destroy को कॉल करने के लिए, आपको #destroy विधि रखने के लिए रूबी के मूल ऐरे क्लास को बंदर करना होगा।

+0

हां और नहीं ... रूबी की गतिशील प्रकृति के कारण, रेल स्वयं ही * सरणी ऑब्जेक्ट्स को पैच करने के बिना रिकॉर्ड के सरणी पर एक विनाशकारी कार्रवाई डाल सकता है ... लेकिन यह एक डिजाइन निर्णय है, मुझे नहीं लगता है। – DGM

1

Record.destroy_all से बचने का सबसे आसान तरीका Record.all.each {|r| r.destroy} होगा। यह कुछ हद तक आपकी एपीआई डिज़ाइन प्राथमिकताओं को संतुष्ट कर सकता है, लेकिन पहले विकल्प की तुलना में बहुत धीमा होना चाहिए।

0

वास्तव में आप (एक तरफ) कर सकते हैं। चूंकि .all एक सरणी देता है, न कि एक सक्रिय रिकॉर्ड संबंध, आप वास्तव में क्या हटा रहे हैं? मैं नहीं कहूंगा Record.all.destroy बिल्कुल तार्किक है - क्या आप सरणी वस्तु को हटा रहे हैं?

एक बात तुम कर सकते हो जिसके परिणामस्वरूप सरणी नक्शा है, और के बाद से map एक proc (&) को स्वीकार करता है, तो आप अपने सरणी में प्रत्येक वस्तु के लिए कि proc निष्पादित कर सकते हैं।

Record.all.map(&:destroy) 

ध्यान दें, यह अपने वस्तुओं के सभी पर कॉलबैक, जो धीमी गति से आप का इरादा हो सकता है को गति प्रदान करने जा रहा है। यदि आप कॉलबैक ट्रिगर करने से बचना चाहते हैं तो आप नष्ट करने के बजाय उचित विध्वंसक विधि को मानचित्र बना सकते हैं।

वैकल्पिक रूप से: (संकेत: हटाना), तो आप सिर्फ कर सकता है:

Record.destroy_all or Record.delete_all 

के रूप में आप अपने प्रश्न में कहा गया है।

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