2013-06-20 9 views
7

साथ मैं निम्नलिखित ActiveRecord फोन है:ActiveRecord मौजूद है? संघों

@payment = account.business.payments.find(params[:id]) 

कौन सा params[:id] की आईडी के साथ एक payment के लिए संघों के माध्यम से खोज करता है। हालांकि, यह एक रिकॉर्ड नॉटफाउंड अपवाद फेंकता है।

मैं यह देखने के लिए exists? पर कॉल करना चाहता हूं कि रिकॉर्ड अपवाद फेंकने से बचने के लिए मौजूद है या नहीं। Payment.exists?(account.business.payments.find(params[:id])) करना काम नहीं करता है।

मैं Payment.exists?(:id => params[:id]) करके केवल payments कि belong_to कि business, और नहीं सभी भुगतान खोज करना चाहते हैं। ऐसा इसलिए है कि मैं जान सकता हूं कि यह उस विशेष खाते का व्यवसाय है।

मैं यह कैसे कर सकता हूं?

नोट: account has_one business और business has_many payments

+0

चूंकि आप एक आईडी की तलाश में हैं, तो आप 'Payment.find (params [: id' का उपयोग नहीं कर सकते ]) 'वास्तव में लंबा रास्ता होने के बजाय? – sircapsalot

+2

@sircapsalot: ओपी सुरक्षा कारणों से दायरे को सीमित करना चाहता है ... – PinnyM

+0

@PinnyM यही कारण है। – darksky

उत्तर

12

उपयोग find के बजाय where, यह एक ActiveRecord::Relation 0 या अधिक रिकॉर्ड का प्रतिनिधित्व करने, जिनमें से बंद आप श्रृंखला .exists? कर सकते हैं वापस आ जाएगी:

@payments = account.business.payments.where(id: params[:id]) 


if @payments.exists? 
    # ... 
end 
3

आप केवल अस्तित्व के लिए जाँच करने के लिए की जरूरत है:

account.business.payments.where(:id => params[:id]).exists? 

आप इस रिकॉर्ड के प्रयोग पर योजना है, तब से केवल 1 रिकॉर्ड की उम्मीद है .first बजाय exists? कहते हैं। संयोग से, आप भी इस का उपयोग कर गतिशील ढूँढ़ने वाले (जो रेल 4 में पदावनत कर रहे हैं) कर सकते हैं:

account.business.payments.find_by_id(params[:id]) 

यह nil वापस आ जाएगी कोई रिकॉर्ड (उड़ा के बजाय) मौजूद हैं।

+0

गतिशील खोजक के बजाय आप 'account.business.payments.where (: id => पैराम्स [: id]) का उपयोग कर सकते हैं। पहले' –

+0

@WizardofOgz: वह पहला था समाधान (जहां मैं वास्तव में इस्तेमाल किया जाएगा तो '.first' का उपयोग करने की सलाह देते हैं)। – PinnyM

+0

ओह, क्षमा करें, मैंने वास्तव में पहली बार अपना जवाब नहीं पढ़ा। मैंने वैसे भी इसे ऊपर उठाया था ;-) चीयर्स –

0

किसी को खारिज किया जा सकता है अगर मैं गलत हूँ, लेकिन मैं

सुझाव है
account.business.payments.where(:id => params[:id]).pluck(:id).present? 

एक प्लक करके आप संबंधित वस्तुओं की तत्कालता को छोड़ रहे हैं। इसका मतलब यह है कि उन्हें स्मृति में लोड करने की आवश्यकता नहीं है जो कुछ चक्र बचाएंगे यदि आप इसे बहुत कुछ कर रहे हैं