कोई रिकॉर्ड नहीं होने पर शून्य से खोजें ()


95

मेरे वर्तमान रेल कार्यक्रम में जब मैं कुछ का उपयोग करता हूं

 user = User.find(10)

जब आईडी = 10 वाला कोई उपयोगकर्ता नहीं है, तो मेरे पास अपवाद होगा जैसे:

ActiveRecord::RecordNotFound: Couldn't find User with ID=10

क्या मैं अपवाद को बढ़ाने के बजाय शून्य हो सकता हूं, जब मैं कुछ ऐसा करूं:

unless user = Challenge.find(10)
  puts "some error msg"         
end

जब कोई रिकॉर्ड नहीं है, तो मैं केवल शून्य प्राप्त करना चाहता हूं और मैं शुरुआत / बचाव का उपयोग नहीं करना चाहता

धन्यवाद


जवाबों:


170

हाँ, बस करो:

Challenge.find_by_id(10)

रेल 4 और 5 के लिए:

Challenge.find_by(id: 10)

11
अजीब! मैंने कभी अनुमान नहीं लगाया था कि यह .find_by_*शून्य और वापसी .findनहीं करेगा।
ddavison

यह 4 पटरियों में बदल गया है, एक विशिष्ट विशेषता द्वारा आइटम खोजने के लिए नए तरीके के लिए इस उत्तर stackoverflow.com/a/26885027/1438478 देखें ।
फ्राकॉन

मुझे रेल्स 4.2 के साथ एक अजीब मुद्दा मिला, जहां जब आप एक हैश को 'x' के रूप में पास करते हैं, तो Something.find_by(id: x)वह WHH क्लॉज के हिस्से के रूप में हैश के सभी गुण / मान जोड़े के साथ एक SQL स्टेटमेंट बनाएगा। मेरे लिए एक रेल बग जैसा दिखता है।
तिलो

रेल (3, 4 या 5) find_by_...एक मॉडल सहित हर विशेषता के लिए गतिशील खोजकर्ता उत्पन्न करता है :id। तो, Challenge.find_by_id(10)रेल संस्करण की परवाह किए बिना काम करना चाहिए।
आर्टा

नीचे दिए गए @MohamedIbrahim द्वारा निर्दिष्ट के रूप में, आप यह भी कर सकते हैं:Challenge.find(10) rescue nil
हॉलगेइर विल्हेमसेन

31

रेल 4 में, गतिशील खोजकर्ता - जैसे find_by_id कि स्वीकृत उत्तर में उपयोग किया गया था - पदावनत किया गया।

आगे बढ़ते हुए, आपको नए सिंटैक्स का उपयोग करना चाहिए:

Challenge.find_by id: 10

4
मामले में किसी और ने मुझे इस तरह से भ्रमित किया है: Challenge.find_by(id: 10)यह लिखने का दूसरा तरीका है
डेविन हॉवर्ड

14

आप इसे थोड़ा हैक कर सकते हैं, बस ActiveRecord क्वेरी इंटरफ़ेस का उपयोग करें।

यह अपवाद को बढ़ाने के बजाय शून्य पर लौटेगा

  User.where(:id => 10).first

इसके बजाय इसका उपयोग करने का एक कारण find_by_idयह है कि यह रेल 3 से 4 तक पोर्टेबल है। रेल 4 में, यह है find_by(:id => 10)
जीन

5

आप केवल अपवाद क्यों नहीं पकड़ते? आपका मामला ठीक वैसा ही दिखता है, जैसे इसके अपवाद थे:

begin
  user = User.find(10)
rescue ActiveRecord::RecordNotFound
  puts "some error msg"
end

यदि आप बचाव ब्लॉक में त्रुटि से उबरना चाहते हैं (जैसे प्लेसहोल्डर उपयोगकर्ता (शून्य पैटर्न) सेट करके), तो आप इस ब्लॉक के नीचे अपने कोड के साथ जारी रख सकते हैं। अन्यथा आप अपने सभी कोड "खुश मामला" के लिए "शुरू" और "बचाव" के बीच के ब्लॉक में रख सकते हैं।


Btw: आप भी begin…endब्लॉक की जरूरत नहीं है , अगर आप पहले से ही एक नियंत्रक विधि के रूप में एक ब्लॉक है। उस मामले में आपको केवल अतिरिक्त लाइन की आवश्यकता होती है rescuenilएक ifबयान के साथ जांच करने की तुलना में बहुत अधिक सुरुचिपूर्ण और आसान संभालना ।
मॉर्गलर

4

आप यह कोशिश कर सकते हैं Challenge.exists?(10)


7
यह अतिरिक्त sql अनुरोध होगा
fl00r

फिर भी मुझे लगता है कि यह परीक्षण के लिए बेहतर है
SomeSchmo

यदि आप लौटाए गए मूल्य की परवाह नहीं करते हैं, लेकिन केवल DB में एक रिकॉर्ड की उपस्थिति के बारे में इसका उपयोग करते हैं
फिलिप बार्टुज़ि

4

मोंगॉयड के साथ संघर्ष करने वालों के लिए , यह पता चला है कि दोनों findऔर find_byविधियां अपवाद को बढ़ाएंगी - कोई बात नहीं आपके रेल संस्करण!

एक विकल्प है (जैसे कि raise_not_found_error ) जो झूठे के लिए सेट किया जा सकता है, लेकिन जब फाल्सी findविधि बनाता है तो अपवाद भी नहीं बढ़ाता है।

इस प्रकार mongoid उपयोगकर्ताओं के लिए समाधान घृणित कोड है:

User.where(id: 'your_id').first # argghhh

मोहम्मद-इब्राहिम द्वारा बचाव नील समाधान के बारे में आप क्या सोचते हैं? मेरे से अधिक सुंदर लगता .where(email: params[:email]).firstहै।
व्यालियम जुड

1
मैं इसके बजाय उस rescueवाक्यविन्यास का उपयोग नहीं करना चाहता क्योंकि यह टाइपोस जैसी समस्याओं को छुपा सकता है
क्रिस्टियानो मेंडोंका

मैं @ morgler समाधान का उपयोग करके घाव कर रहा हूं।
व्यालियम जुड

2

बस के रूप में सरल:

user = User.find(10) rescue nil

1
मैं इस बारे में अधिक विशिष्ट होना चाहूंगा कि इस मामले में किस त्रुटि से बचने की उम्मीद है, ActiveRecord :: RecordNotFound। जैसा कि इस उत्तर पर @morgler
luizrogeriocn

2
मुझे व्यक्तिगत रूप से यह सबसे अच्छा जवाब लगता है। मैं पहले से ही अपना कोड बता रहा हूं कि अगर उपयोगकर्ता को नहीं मिल रहा है तो क्या करना हैif user...else
Wylliam Judd

0

आप आवश्यक विशेषता (अपने मामले में आईडी) के साथ find_by का उपयोग कर सकते हैं, यह दिए गए आईडी नहीं मिलने पर त्रुटि देने के बजाय शून्य लौटाएगा।

user = Challenge.find_by_id(id_value)

या आप नए प्रारूप का उपयोग कर सकते हैं:

user = Challenge.find_by id: id_value

आप कहां उपयोग कर सकते हैं, लेकिन आपको यह जानना होगा कि शून्य या अधिक रिकॉर्ड के साथ एक सक्रिय रिकॉर्ड संबंध कहां लौटाते हैं, आपको केवल एक रिकॉर्ड या शून्य मामले में वापस लौटने के लिए पहले उपयोग करने की आवश्यकता है।

user = Challenge.where(id: id_value).first
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.