ব্যতিক্রম ছাড়াই অ্যারে রেলস অ্যাক্টিভেকর্ডে আইডি কোথায় নির্বাচন করবেন


134

আমার কাছে আইডির অ্যারে থাকলে, পছন্দ হয়

ids = [2,3,5]

এবং আমি সঞ্চালন

Comment.find(ids)

সবকিছু ঠিকঠাক কাজ করে কিন্তু যখন এমন আইডি থাকে যা বিদ্যমান নেই, আমি একটি ব্যতিক্রম পাই। আমি উত্পাদিত আইডিগুলির তালিকা পাই যা কিছু ফিল্টারের সাথে মেলে এবং আমি এর থেকে কিছু করি তার চেয়ে বেশি উত্পন্ন হয়

current_user.comments.find(ids)

এবার আমার কাছে একটি বৈধ মন্তব্য আইডি থাকতে পারে, যা প্রদত্ত ব্যবহারকারীর অন্তর্ভুক্ত নয়, সুতরাং এটি পাওয়া যায় না এবং আমি একটি ব্যতিক্রম পাই।

আমি চেষ্টা করেছি find(:all, ids), তবে এটি সমস্ত রেকর্ড ফিরিয়ে দিয়েছে।

এখনই আমি এটি করতে পারি

current_user.comments.select { |c| ids.include?(c.id) }

তবে এটি আমার কাছে সুপার অদক্ষ সমাধানের মতো বলে মনে হচ্ছে।

অ-বিদ্যমান রেকর্ডে ব্যতিক্রম না পেয়ে অ্যারেতে আইডি নির্বাচন করার আরও ভাল উপায় আছে কি ?

উত্তর:


215

আপনি যদি উদ্বিগ্ন হয়ে থাকেন এমন ব্যতিক্রমটি যদি এড়ানো হয় তবে "ফাইন্ড_ল_বাই .." ফাংশনগুলির পরিবার ব্যতিক্রম ছাড়াই কাজ করে।

Comment.find_all_by_id([2, 3, 5])

আইডির কিছু না থাকলেও কাজ করবে। এটি কাজ করে

user.comments.find_all_by_id(potentially_nonexistent_ids)

কেস এছাড়াও।

আপডেট: রেল 4

Comment.where(id: [2, 3, 5])

এটি আমার পছন্দসই সমাধান, এটি ব্যতিক্রম হ্যান্ডলিংয়ের রুটের চেয়ে পরিচ্ছন্ন বলে মনে হচ্ছে
স্যাম সাফ্রন

5
এই অন্য এক্সটেনশন হিসাবে, আপনি শৃঙ্খল জটিল অবস্থার প্রয়োজন উচিত, আপনি এমনকি কাজ করতে পারে Comment.all (: শর্ত => [ "অনুমোদিত ও (IN) আইডি?", [1,2,3]])
ওমর কোরেশী


3
@JonathanLin সঠিক, mjnissim এর উত্তর পছন্দের করা উচিত: stackoverflow.com/a/11457025/33226
গেভিন মিলার

6
এটি কোনও এর Arrayপরিবর্তে একটি ফেরত দেয় ActiveRecord::Relationযা পরে এটির সাথে আপনি কী করতে পারেন তা সীমাবদ্ধ করে। Comment.where(id: [2, 3, 5])একটি শূণ্য দেখায় ActiveRecord::Relation
জোশুয়া পিন্টার

147

আপডেট: এই উত্তরটি রেল ৪.x এর জন্য আরও প্রাসঙ্গিক

এটা কর:

current_user.comments.where(:id=>[123,"456","Michael Jackson"])

এই পদ্ধতির শক্তিশালী দিকটি হ'ল এটি কোনও Relationবস্তু ফেরত দেয় , যার প্রতি আপনি আরও .whereধারা, .limitধারা, ইত্যাদি যোগ দিতে পারেন যা খুব সহায়ক। এটি ব্যতিক্রম ছোঁড়া ছাড়াই অস্তিত্বহীন আইডিগুলিকে অনুমতি দেয়।

নতুন রুবি সিনট্যাক্সটি হ'ল:

current_user.comments.where(id: [123, "456", "Michael Jackson"])

whereঅ্যারের সাথে তুলনা করার সময় সিনট্যাক্স নিশ্চিত করার জন্য ধন্যবাদ । আমি ভেবেছিলাম আমাকে একটি INবিবৃতি দিয়ে এসকিউএল কোড করতে হবে , তবে এটি পরিষ্কার দেখায় এবং হ্রাসকারীদের জন্য একটি সহজ প্রতিস্থাপন scoped_by_id
মার্ক বেরি

1
এটাকে কী বলা হয় এবং এটি কীভাবে কাজ করে? এটা কি রেল ম্যাজিক ?! একজন সহকর্মী মন্তব্য হিসাবে, তার মত 'একটি বস্তু তালিকা "সঙ্গে একটি পূর্ণসংখ্যা ব্যবহার করছি।
atw

22

আপনার যদি আরও নিয়ন্ত্রণের প্রয়োজন হয় (সম্ভবত আপনাকে টেবিলের নামটি লিখতে হবে) আপনি নিম্নলিখিতগুলিও করতে পারেন:

Model.joins(:another_model_table_name)
  .where('another_model_table_name.id IN (?)', your_id_array)

ঠিক আমি খুঁজছেন ছিল কি. ধন্যবাদ!
মাইসটিক

আপনি your_id_arrayযখন জিনিসগুলি ফিরে পাবেন তখন কি অর্ডার রাখার কোনও উপায় আছে ?
জোশুয়া পিন্টার 18

@ জোশপিন্টার আমি মনে করি না এটি একই ক্রমে ডাটাবেসগুলি জিনিস ফেরত প্রত্যাশার একটি নির্ভরযোগ্য উপায়। জিনিসগুলির সঠিক ক্রম নিশ্চিত করার জন্য সম্ভবত শেষে একটি অর্ডার বাই ক্যোয়ারী যুক্ত করুন।
জোনাথন লিন

জনাথনলিন জনাথনের প্রতিক্রিয়াটির জন্য ধন্যবাদ। আপনি অবশ্যই ঠিক বলেছেন। একটি ব্যবহার করা ORDER BYআমার পরিস্থিতিতে কাজ করবে না কারণ আদেশটি কোনও গুণকের উপর ভিত্তি করে নয়। তবে এসকিউএল এর মাধ্যমে এটি করার একটি উপায় আছে (তাই এটি দ্রুত) এবং কেউ কেউ এর জন্য একটি রত্নও তৈরি করেছেন। এই প্রশ্নোত্তরটি দেখুন: স্ট্যাকওভারফ্লো.com
জোশুয়া পিন্টার

10

এখন .ফাইন্ড এবং .ফাইন্ড_বাই_আইডি পদ্ধতিগুলি রেলগুলিতে অবচয় করা হয়েছে 4. সুতরাং পরিবর্তে আমরা নীচে ব্যবহার করতে পারি:

Comment.where(id: [2, 3, 5])

আইডির কিছু বিদ্যমান না থাকলেও এটি কাজ করবে। এটি কাজ করে

user.comments.where(id: avoided_ids_array)

আইডি বাদ দিয়েও

Comment.where.not(id: [2, 3, 5])

3
github.com/rails/activerecord-deprecated_finders .find এবং .find_by_id পদ্ধতি পাগল উঠিয়ে না হয় 4.
ক্যানা

0

আপনার অ্যাপ্লিকেশন হত্যা ব্যতিক্রম এড়ানোর জন্য আপনাকে সেই ব্যতিক্রমগুলি ধরতে হবে এবং আইডিটি খুঁজে পাওয়া যায় না এমন পরিস্থিতিতে আপনার অ্যাপের জন্য আচরণের সংজ্ঞা দেওয়া উচিত app

begin
  current_user.comments.find(ids)
rescue
  #do something in case of exception found
end

রুবি ব্যতিক্রম সম্পর্কিত আরও তথ্য এখানে ।


1
হ্যাঁ এটি সমস্যার সমাধান করে তবে এটি কোনও পরিষ্কার সমাধান নয়
জাকুব আর্নল্ড

3
আপনি যদি কোনও ব্যতিক্রম ধরতে চলেছেন তবে আপনি যে ব্যতিক্রমটি ধরার প্রত্যাশা করেছেন তা ঘোষণা করা উচিত, অন্যথায় আপনি এটি এমন কোনও বিষয়টিকে ঝুঁকির মধ্যে ফেলেছিলেন যা আপনি প্রত্যাশা করছেন না এবং একটি আসল সমস্যাটি লুকিয়ে রাখছেন।
হেইগিন

0

আপনি যদি সেখানে অন্য শর্ত রাখতে চান তবে আপনি নাম_স্কোপেও এটি ব্যবহার করতে পারেন

উদাহরণস্বরূপ কিছু অন্যান্য মডেল অন্তর্ভুক্ত:

নাম_স্কোপ 'get_by_ids', ল্যাম্বদা {| আইডিস | {: অন্তর্ভুক্ত => [: মন্তব্যসমূহ],: শর্তাবলী => ["কমেন্টস.আইএন ইন (?)", আইডি]}

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