2012-06-07 3 views
7

में एक delete_all या destroy_all क्वेरी का पूर्वावलोकन कैसे करें आप ड्रिल को जानते हैं: कुछ अमान्य डेटा उत्पादन डेटाबेस में पॉप अप होता है और आपको इससे छुटकारा पाना पड़ता है। आप क्वेरी में आपके रेल उत्पादन सर्वर और प्रकार पर सांत्वना ऊपर आग:रेल

Foo.where(bar: 'baz').all 

आप दिए गए डेटा की समीक्षा करने और इसे आप क्या हटाने की जरूरत है। फिर आप टाइप करें:

Foo.where(bar: 'baz').destroy_all 

और आपका दिल एक सेकंड के लिए बंद हो जाता है। आप इसे चलाने से पहले क्वेरी देखना चाहते हैं।

क्या रेल में ऐसा करने का कोई तरीका है? मैं एक विधि समान की तलाश में हूँ

Foo.where(bar: 'baz').to_sql 

के लिए, लेकिन एक है कि वापस आ जाएगी क्वेरी हटाएं।

उत्तर

1

बस मेरे सिर के ऊपर से, आप कंसोल मोड में कंसोल चला सकते हैं और एसक्यूएल देखने के लिए हटाएं क्वेरी चला सकते हैं। परिवर्तन सिर्फ बाहर निकलने पर वापस लुढ़का जाएगा।

+0

मैं यह वास्तव में नहीं है लगता है हालांकि, अगर आप वास्तव में "to_sql" की तलाश में हैं, तो अपने प्रश्न का उत्तर दें तथा। – cdesrosiers

+0

मैं पूरी तरह से सैंडबॉक्स मोड के बारे में भूल गया! यह वही नहीं है जो मैं खोज रहा था लेकिन यह वही करता है जो मुझे करने की ज़रूरत है। विशेष रूप से यह देखते हुए कि मैं जो खोज रहा था वह असंभव है: डी –

2

समस्या यह है कि destroy_all एक एकल SQL क्वेरी नहीं चलाता है। यह वस्तुओं के एक हैश के माध्यम से पुनरावृत्त करता है, उन्हें तत्काल बनाता है, उनके कॉलबैक चलाता है, और उसके बाद उस ऑब्जेक्ट की नष्ट विधि को कॉल करता है। रेलों ने इन प्रश्नों की एक श्रृंखला बनाने के तरीके में कोई निर्माण नहीं किया है।

Cdesroisiers सही है कि आप सैंडबॉक्स मोड में क्वेरी का परीक्षण कर सकते हैं, लेकिन वास्तविक समस्या यह है कि आप delete_all चलाने के अपने निर्णय का दूसरा अनुमान लगा रहे हैं, भले ही आपने सत्यापित किया है कि जो भी डेटा लक्षित किया जा रहा है।

PaperTrail जैसे ActiveRecord संस्करणिंग मणि का उपयोग करने पर विचार करें यदि आप ActiveRecord पर ऑब्जेक्ट को ठीक से हटाने के लिए तैयार नहीं हैं।

+0

बैच ऑपरेशन के रूप में 'delete_all' को लागू नहीं करने के पीछे औचित्य क्या है, मैंने सोचा था कि डेटाबेस में राउंड ट्रिप करने के बजाय बैच में ऐसा करना बहुत सस्ता है। – Bedasso

+2

delete_all एक बैच ऑपरेशन है। destroy_all उन्हें एक-एक करके करता है। delete_all मौजूद है क्योंकि यह तेज़ है, destroy_all उपयोगी हो सकता है क्योंकि यह कॉलबैक को नष्ट करने से पहले/बाद में आग लग जाएगा। –

+0

पेपरट्रेल ऐप में उपयोग के लिए बहुत अच्छा है, लेकिन मुझे बस कुछ अनावश्यक डेटा से छुटकारा पाने की आवश्यकता है। फिर भी धन्यवाद! –

1

destroy_all विधि एक ही कर रही है:

Foo.where(bar: 'baz').each { |object| object.destroy } 

तो एसक्यूएल हो जाता है

DELETE FROM foo WHERE foo.id = your_objects_id_attribute 



डॉक्स से:

def destroy_all(conditions = nil) 
    find(:all, :conditions => conditions).each { |object| object.destroy } 
    end 
+1

मेरा मानना ​​है कि जेनरेट किए गए एसक्यूएल में कई डिलीट क्वेरी होंगे - प्रत्येक ऑब्जेक्ट में से एक। – mrt