[ruby-on-rails] अपवाद के बिना ऐरे रेल ActiveRecord में आईडी का चयन कैसे करें



2 Answers

अद्यतन: यह उत्तर रेल 4.x के लिए अधिक प्रासंगिक है

यह करो:

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

इस दृष्टिकोण का मजबूत पक्ष यह है कि यह एक Relation ऑब्जेक्ट देता है, जिसमें आप अधिक शामिल हो सकते हैं। .where खंड, .limit खंड, आदि, जो बहुत उपयोगी है। यह अपवाद फेंकने के बिना मौजूद गैर-मौजूद आईडी को भी अनुमति देता है।

नया रूबी वाक्यविन्यास होगा:

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

जब मेरे पास आईडी की सरणी होती है, जैसे

ids = [2,3,5]

और मैं प्रदर्शन करता हूँ

Comment.find(ids)

सब कुछ ठीक काम करता है। लेकिन जब कोई आईडी मौजूद नहीं है, तो मुझे अपवाद मिलता है। यह आम तौर पर तब होता है जब मुझे कुछ फ़िल्टर से मेल खाने वाली आईडी की सूची मिलती है और मैं कुछ ऐसा करता हूं

current_user.comments.find(ids)

इस बार मेरे पास एक वैध टिप्पणी आईडी हो सकती है, जो कि दिए गए उपयोगकर्ता से संबंधित नहीं है, इसलिए यह नहीं मिला है और मुझे अपवाद मिलता है।

मैंने find(:all, ids) की कोशिश की find(:all, ids) , लेकिन यह सभी रिकॉर्ड लौटाता है।

एकमात्र तरीका मैं अब कर सकता हूं

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

लेकिन यह मुझे सुपर अक्षम समाधान की तरह लगता है।

क्या गैर-मौजूदा रिकॉर्ड पर अपवाद प्राप्त किए बिना ऐरे में आईडी का चयन करने का कोई बेहतर तरीका है?




अब .find और .find_by_id विधियों को रेल 4 में बहिष्कृत किया गया है। तो इसके बजाय हम नीचे उपयोग कर सकते हैं:

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

यह काम करेगा भले ही कुछ आईडी मौजूद न हों। यह काम करता है

user.comments.where(id: avoided_ids_array)

आईडी को छोड़कर भी

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



यदि आप अन्य स्थितियों को रखना चाहते हैं तो आप इसे नाम_स्कोप में भी उपयोग कर सकते हैं

उदाहरण के लिए कुछ अन्य मॉडल शामिल करें:

name_scope 'get_by_ids', lambda {| ids | {: शामिल => [: टिप्पणियां],: शर्तें => ["comments.id IN (?)", ids]}}




Related