2013-07-19 13 views
8

में सभी को हटाएं मेरे पास उपयोगकर्ता के लिए user has_many agents और agent belongs_to user के रूप में एक सहयोग है। रेल कंसोल में, मैं किसी विशेष परिदृश्य का परीक्षण करने के लिए विभिन्न उपयोगकर्ताओं का उपयोग करने की कोशिश कर रहा हूं और मैं कोई एजेंट नहीं चाहता हूं, इसलिए मैं user.agents को हटाना चाहता हूं। मैंने user.agents.map(&:destroy) की कोशिश की, लेकिन यह ActiveRecord::StaleObjectError: Attempted to delete a stale object के रूप में त्रुटि देता है। मैंने user.agents.delete_all भी कोशिश की है, लेकिन यह भी काम नहीं करता है। मैं रेल कंसोल में एक ही कमांड वाले उपयोगकर्ता एजेंटों को हटा देता हूं।रेल कंसोल

उत्तर

18

बेहतर होगा कि तुम का उपयोग destroy क्योंकि यह सभी रेल जादू (कॉलबैक और इस तरह)

user.destroy #For a single record 
user.agents.destroy_all #For a collection 
+0

मैं 'नष्ट करने के लिए user.agents' चाहता हूँ और मैं' user.agents.destroy कोशिश की, लेकिन यह मुझे त्रुटि देता है के लिए काम करता है। –

+1

या तो 'user.destroy' या तो' user.agents.destroy_all' है। एक रिकॉर्ड पर पहला एक अधिनियम, संग्रह पर दूसरा एक अधिनियम – Benj

0
ActiveRecord::StaleObjectError 

Optimistic locking के लिए है के माध्यम से चला जाता है, फिर से हटाने का प्रयास करने से पहले किसी भी ताले आप उस पर है हटा दें। जांचें कि कोई और सिस्टम का उपयोग कर रहा है या आपके द्वारा खोले गए किसी भी फॉर्म को सबमिट कर रहा है या नहीं।

5

आप .destroy_all विधि की तलाश में हैं। यह किसी दिए गए संग्रह के सभी रिकॉर्ड नष्ट कर देता है। तो user.agents.destroy_all, user.agents के लिए एक खाली सरणी वापस कर देगा।

आप .delete_all का उपयोग नहीं कर सके क्योंकि यह एक क्लास विधि है और यह किसी दिए गए शर्त से मेल खाने वाले रिकॉर्ड हटा देता है। इस तरह, Agent.delete_all(condition)। यदि किसी शर्त के बिना उपयोग किया जाता है तो यह मिलान किए गए तालिका से सभी रिकॉर्ड हटा देता है।

ध्यान रखें कि .destroy विधियां उदाहरण विधियां हैं। वे किसी ऑब्जेक्ट को तुरंत चालू करते हैं और इसे मिटाने से पहले कॉलबैक करते हैं। .delete विधियां कक्षा विधियां हैं और वे सीधे किसी वस्तु को मिटा देते हैं।

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