2009-05-06 13 views
98

संभव डुप्लिकेट:
Model.find(1) gives ActiveRecord error when id 1 does not existरेल: रेल (आईडी) रेल में अपवाद क्यों उठाता है?

यदि डेटाबेस में 1 की एक आईडी कोई उपयोगकर्ता नहीं है, User.find(1) की कोशिश कर रहा एक अपवाद को बढ़ा देंगे।

यह क्यों है?

उत्तर

181

क्योंकि इस तरह आर्किटेक्ट इरादा खोज (आईडी) काम करने के लिए, RDoc में संकेत के रूप है:

आईडी द्वारा खोजें - यह या तो एक विशिष्ट आईडी (1), एक (id की सूची हो सकता है 1, 5, 6), या आईडी की एक सरणी ([5, 6, 10])। यदि सभी सूचीबद्ध आईडी के लिए कोई रिकॉर्ड नहीं मिल सकता है, तो RecordNotFound उठाया जाएगा।

यदि आप अपवाद को उठाना नहीं चाहते हैं, तो find_by_id का उपयोग करें, जो निर्दिष्ट आईडी के साथ कोई ऑब्जेक्ट नहीं ढूंढ पाता है। आपका उदाहरण User.find_by_id(1) होगा।

+0

लेकिन रिकॉर्ड नॉटफाउंड लौटने का इसका क्या फायदा है? नील वापस लौटने के बजाए कोई व्यक्ति इस व्यवहार को क्यों चाहेगा? – Arcolye

+2

रिकॉर्ड नॉटफाउंड उठाया गया है, वापस नहीं किया गया। यह कॉलर के नियंत्रण प्रवाह को अलग करने की अनुमति देता है, क्योंकि आपको रिटर्न वैल्यू शून्य की जांच करने की आवश्यकता नहीं है (आप इसके बजाय प्रारंभ/बचाव ब्लॉक का उपयोग करेंगे)। – runako

+3

यह अभी भी यह स्पष्ट नहीं करता है कि यह डिफ़ॉल्ट व्यवहार क्यों है, जहां ActiveRecord के अधिकांश अन्य हिस्सों में डिफ़ॉल्ट व्यवहार विफलता के लिए शून्य या झूठी वापसी करना है, और अपवाद नियंत्रण प्रवाह को बैंग (#save!) में समाप्त होने वाली विधियों पर छोड़ना है। । –

-3

रनको के स्पष्टीकरण के आगे, वास्तव में यह अपवाद है कि अपवाद उठाया गया है या नहीं। मैं एक ब्लॉग एप्लिकेशन पर काम कर रहा हूं और मैं अगली या पिछली ब्लॉग एंट्री देखने के लिए समर्थन जोड़ना चाहता था। मैं अपने Post मॉडल के लिए दो उदाहरण तरीकों कि बस लौट nil जब आप जब पहली पोस्ट, या अगले पोस्ट देखते समय पिछले पोस्ट को देखने के पिछले पोस्ट प्राप्त करने की कोशिश को जोड़ने में सक्षम था:

def next 
    Post.find_by_id(id + 1) 
end 

def previous 
    Post.find_by_id(id - 1) 
end 

यह मेरा बचा जाता है सहायक कोड जो सशर्त रूप से पिछला पोस्ट/अगला पोस्ट लिंक RecordNotFound अपवाद को संभालने से उत्पन्न करता है, जो खराब होगा क्योंकि यह नियंत्रण प्रवाह के लिए अपवाद का उपयोग करेगा।

+0

यदि आपके डीबी में आपके रिकॉर्ड अनुक्रमिक आईडी नहीं हैं तो यह बहुत कमजोर नहीं होगा – Pete

+0

@zoltarSpeaks यह होगा, लेकिन व्यावहारिक रूप से उनके पास अनुक्रमिक आईडी हैं, इसलिए यह कुल गैर-मुद्दा है। –

+25

यदि, उदाहरण के लिए, आपके पास एक बहिष्कार है, तो आपको एक स्पोरैडिक बग मिलेगा जो ट्रैक करना मुश्किल है। बेहतर अगले प्राप्त करने के लिए रास्ता/पिछला होगा, कुछ ऐसा होगा: Post.where ("id>?", id) .limit (1) अगले और पोस्ट के लिए।जहां (0 आईडी