आप ActiveRecord ऑब्जेक्ट को कैसे हटाते हैं?


328

आप ActiveRecord ऑब्जेक्ट को कैसे हटाते हैं?

मैंने एक्टिव रिकॉर्ड क्वेरिंग को देखा और इसे डिलीट करने पर कुछ भी नहीं है जो मैं देख सकता हूं।

  1. द्वारा हटाएं id,

  2. वर्तमान वस्तु की तरह हटाएँ: user.remove,

  3. क्या आप एक whereखंड के आधार पर हटा सकते हैं ?

जवाबों:


572

यह destroyऔर destroy_allतरीके हैं, जैसे

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

वैकल्पिक रूप से आप उपयोग कर सकते हैं deleteऔर delete_allजो लागू नहीं करेगा :before_destroyऔर :after_destroyकॉलबैक या किसी आश्रित एसोसिएशन विकल्प।

User.delete_all(condition: 'value') आपको प्राथमिक कुंजी के बिना रिकॉर्ड को हटाने की अनुमति देगा

नोट : @ हम्मीर की टिप्पणी से, user.destroyयदि उपयोगकर्ता मॉडल में कोई प्राथमिक कुंजी नहीं है तो काम नहीं करेगा।

नोट 2 : @ pavel-chuchuva की टिप्पणी से, destroy_allशर्तों के delete_allसाथ और स्थितियों के साथ रेल 5.1 में पदावनत कर दिया गया है - मार्गदर्शक देखें। rubyonrails.org/5_1_release_notes.html


4
यह अच्छा होगा यदि आप अपने जवाब में @ हम्मीर की टिप्पणी शामिल कर सकते हैं। यह पता लगाने के लिए कि मैं अपने मॉडल ऑब्जेक्ट को नष्ट क्यों नहीं कर पाया ...
the_citic


यह मेरे डेटाबेस में केवल हटाए गए कॉलम डेटा को अपडेट क्यों करता है? मैं डेटा की पूरी पंक्ति कैसे हटा सकता हूं?
टॉमी

1
स्थिति और शर्तों के साथ delete_all साथ destroy_all रेल 5.1 में पदावनत किया गया है - देखें guides.rubyonrails.org/5_1_release_notes.html
पावेल Chuchuva

यह User.find_by(username:"bob") भी नष्ट या नष्ट करने के लिए रिकॉर्ड की पहचान करने के लिए अच्छा है।
बार्लॉप

60

नहीं है delete, delete_all, destroy, और destroy_all

डॉक्स हैं: पुराने डॉक्स और रेल 3.0.0 डॉक्स

deleteवस्तुओं को त्वरित नहीं करता है, जबकि destroyकरता है। सामान्य तौर पर, deleteकी तुलना में तेज है destroy


4
deleteतेज है, लेकिन आपके द्वारा मॉडल पर परिभाषित कॉलबैक को दरकिनार कर देगा
रुडी

48
  1. User.destroy

User.destroy(1)id == 1और :before_destroyऔर :after_destroyकॉलबैक के साथ उपयोगकर्ता को हटा देगा । उदाहरण के लिए यदि आपके पास संबंधित रिकॉर्ड हैं

has_many :addresses, :dependent => :destroy

उपयोगकर्ता के नष्ट होने के बाद उसके पते भी नष्ट कर दिए जाएंगे। यदि आप इसके बजाय डिलीट एक्शन का उपयोग करते हैं, तो कॉलबैक नहीं होंगे।

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) या User.delete_all(<conditions>)

सूचना : उपयोगकर्ता एक वर्ग है और उपयोगकर्ता एक उदाहरण वस्तु है


3
संबंधित रिकॉर्ड को संबोधित करने के लिए धन्यवाद।
ऋषि मिशेल

2
BEWARE: User.destroy_all()कॉलबैक चलाता है, इसलिए कुछ भी हटाने से पहले, यह रिकॉर्ड लोड करता है। यह दो एसक्यूएल बयान एक नहीं है। प्रदर्शन निहितार्थ के अलावा, यह समवर्ती निहितार्थ भी है। सुरक्षित कॉल स्किप कॉलबैक; User.delete_all()केवल एक DELETE FROM...आदेश जारी करेगा ।
एंड्रयू होडकिंसन

1
शर्तों के साथ destroy_all रेल 5.1 में पदावनत किया गया है - देखें guides.rubyonrails.org/5_1_release_notes.html
पावेल Chuchuva
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.