() নীল সঙ্গে খুঁজে যখন কোন রেকর্ড নেই


98

আমার বর্তমান রেল প্রোগ্রামে যখন আমি কিছু ব্যবহার করি

 user = User.find(10)

যখন আইডি = 10 সহ কোনও ব্যবহারকারী নেই তখন আমার মতো ব্যতিক্রম থাকবে:

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

আমি যখন কিছু এরকম কিছু করি তখন কি আমি ব্যাতিক্রম বাড়ানোর পরিবর্তে শীঘ্রই পেতে পারি:

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

আমি যখন কোনও রেকর্ড নেই তখন আমি কেবল শূন্য হতে চাই এবং আমি আরম্ভ / উদ্ধার ব্যবহার করতে চাই না

ধন্যবাদ


উত্তর:


175

হ্যাঁ, কেবল করুন:

Challenge.find_by_id(10)

4 এবং 5 এর জন্য:

Challenge.find_by(id: 10)

12
অস্বাভাবিক! আমি কখনই অনুমান করতে পারতাম না যে .find_by_*ফিরে আসবে এবং কখনই ফিরে .findআসবে না।
ডিডিসন

এটি রেল 4 এ পরিবর্তিত হয়েছে, নির্দিষ্ট গুণাবলীর দ্বারা কোনও আইটেম সন্ধানের নতুন উপায়ের জন্য এই উত্তরটি stackoverflow.com/a/26885027/1438478 দেখুন ।
ফ্রালকন

R.২ রেলগুলির সাথে আমি একটি অদ্ভুত সমস্যা পেয়েছি যেখানে আপনি যখন হ্যাশটিকে 'এক্স' হিসাবে পাস করেন তখন হুশের Something.find_by(id: x)সমস্ত অ্যাট্রিবিউট / মান জোড়ের বিধি হিসাবে অংশে একটি এসকিউএল স্টেটমেন্ট তৈরি করে। আমার কাছে রেলস বাগের মতো মনে হচ্ছে।
টিলো

রেলস (3, 4 বা 5) find_by_...একটি মডেল সহ প্রতিটি বৈশিষ্ট্যের জন্য গতিশীল অনুসন্ধানকারী তৈরি করে :id। সুতরাং, Challenge.find_by_id(10)রেল সংস্করণ নির্বিশেষে কাজ করা উচিত।
আরতা

নীচে @ মোহাম্মদআইব্রাহিম দ্বারা উল্লিখিত হিসাবে আপনি এগুলি করতে পারেন:Challenge.find(10) rescue nil
হলজিয়ার উইলহেলমসেন

31

4 রেলগুলিতে, গতিশীল অনুসন্ধানকারী - যেমন find_by_idস্বীকৃত উত্তরে ব্যবহৃত হয়েছিল - হ্রাস করা হয়েছিল।

এগিয়ে চলার সাথে সাথে আপনার নতুন সিনট্যাক্সটি ব্যবহার করা উচিত:

Challenge.find_by id: 10

4
কেস অন্য কেউ আমার মত এই দ্বারা বিভ্রান্ত হয়: Challenge.find_by(id: 10)এই লেখার অন্যান্য উপায়
Devin হাওয়ার্ড

14

আপনি এটি কিছুটা হ্যাকিশ করতে পারেন, কেবল অ্যাক্টিভেকর্ড ক্যোয়ারী ইন্টারফেস ব্যবহার করুন।

এটি ব্যতিক্রম উত্থাপনের পরিবর্তে শূন্যতা ফিরে আসবে

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

find_by_idএটির পরিবর্তে এটি ব্যবহার করার একটি কারণ এটি 3 থেকে 4 টি রেল থেকে বহনযোগ্য rail রেল 4 এ, এটি find_by(:id => 10)
জিন

5

আপনি কেবল ব্যতিক্রমটি ধরেন না কেন? আপনার কেস দেখতে হ'ল ব্যতিক্রমগুলির জন্য কীভাবে ব্যতিক্রম করা হয়েছিল:

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

আপনি যদি রেসকিউ ব্লকের ত্রুটিটি থেকে পুনরুদ্ধার করতে চান (যেমন কোনও স্থানধারক ব্যবহারকারী সেট করে (নাল প্যাটার্ন)), আপনি এই ব্লকের নীচে আপনার কোডটি দিয়ে চালিয়ে যেতে পারেন। অন্যথায় আপনি "সুখী কেস" এর জন্য আপনার সমস্ত কোডটি "শুরু" এবং "উদ্ধার" এর মধ্যে ব্লকে রেখে দিতে পারেন।


বিটিডব্লিউ: আপনার begin…endযদি ইতিমধ্যে একটি নিয়ন্ত্রণকারী পদ্ধতি হিসাবে কোনও ব্লক থাকে তবে আপনার ব্লকও লাগবে না । সেক্ষেত্রে আপনার কেবলমাত্র অতিরিক্ত লাইনটি হ'ল rescueলাইন। nilএকটি ifবিবৃতি দিয়ে যাচাই করার চেয়ে হ্যান্ডেল করা অনেক বেশি মার্জিত এবং সহজ ।
মরগলার


4

মঙ্গোডের সাথে লড়াই করে যাচ্ছেন তাদের পক্ষে , এটি প্রমাণিত হয়েছে যে উভয় findএবং find_byপদ্ধতিই ব্যতিক্রম বাড়িয়ে তুলবে - আপনার রেলের সংস্করণ কোনও বিষয় নয়!

এখানে একটি বিকল্প রয়েছে (যথা উত্থাপন_ন_ফাউন্ড_অরর ) যা মিথ্যাতে সেট করা যেতে পারে, কিন্তু যখন মিথ্যা findপদ্ধতি পদ্ধতিটি ব্যতিক্রম করে তাও বাড়ায় না।

সুতরাং মংগয়েড ব্যবহারকারীদের জন্য সমাধানটি হ'ল জঘন্য কোড:

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

মোহাম্মদ-ইব্রাহিমের উদ্ধার নীল সমাধান সম্পর্কে আপনি কী ভাবেন? .where(email: params[:email]).firstআমার চেয়ে বেশি মার্জিত মনে হচ্ছে ।
উইলিয়াম জড

4
আমি বরং rescueসিনট্যাক্সটি ব্যবহার করব না কারণ এটি টাইপসের মতো সমস্যাগুলি আড়াল করতে পারে
ক্রিশ্চিয়ানো মেনডোনাসা

আমি @ মরগলারের সমাধানটি ব্যবহার করে ক্ষতবিক্ষত হয়েছি।
উইলিয়াম জড

2

ঠিক যেমন সহজ:

user = User.find(10) rescue nil

4
এই ক্ষেত্রে ত্রুটিটি কী থেকে উদ্ধার করা হবে বলে প্রত্যাশা করা উচিত তার চেয়ে আমি আরও সুনির্দিষ্ট হয়ে উঠতে চাই, এই ক্ষেত্রে অ্যাক্টিভেকর্ড :: রেকর্ডনটফাউন্ড। @ উত্তরদাতা
luizrogeriocn

4
আমি ব্যক্তিগতভাবে এটি সেরা উত্তর বলে মনে করি। আমি ইতিমধ্যে আমার কোডটি বলছি যদি ব্যবহারকারীকে না পাওয়া যায় তবে কী করতে হবেif user...else
উইলিয়াম জড

0

আপনি প্রয়োজনীয় গুণাবলীর সাহায্যে Find_by ব্যবহার করতে পারেন (আপনার ক্ষেত্রে আইডি) প্রদত্ত আইডিটি খুঁজে পাওয়া না গেলে এটি ত্রুটি দেওয়ার পরিবর্তে শূন্য হয়ে যাবে।

user = Challenge.find_by_id(id_value)

অথবা আপনি নতুন ফর্ম্যাটটি ব্যবহার করতে পারেন:

user = Challenge.find_by id: id_value

আপনি যেখানে ব্যবহার করতে পারেন তবে আপনাকে জানতে হবে যে শূন্য বা আরও বেশি রেকর্ডের সাথে সক্রিয় রেকর্ডের সম্পর্কটি ফিরে আসার জন্য আপনাকে কেবল একটি রেকর্ড ফেরত দিতে প্রথমে ব্যবহার করতে হবে বা শূন্য রেকর্ড ফিরে আসার ক্ষেত্রে শূন্য করতে হবে।

user = Challenge.where(id: id_value).first
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.