2010-12-13 11 views
25

मैं इस तरह लग रहा है एक साधारण सी समस्या मैं नए ActiveRecord क्वेरी इंटरफ़ेस की मेरी गलतफहमी के कारण आ रही है, लेकिन इस उदाहरण ले:रेल 3, सक्रिय रिकॉर्ड क्वेरी रिटर्न ActiveRecord :: रिलेशन वस्तु, वस्तुओं के बजाय

>> Category.first.recipes 
=> [ ... ] # array of recipes 

हालांकि:

>> Category.where(:id => 1).recipes 
=> NoMethodError: undefined method `recipes' for #<ActiveRecord::Relation:0x000001033dc9e0> 

यहाँ क्या हो रहा है? मेरी where विधि ActiveRecord::Relation ऑब्जेक्ट क्यों लौटाती है? मैं यहां क्वेरी से ऑब्जेक्ट्स को कैसे पुनर्प्राप्त कर सकता हूं?

उत्तर

42

यह वास्तव में जानबूझकर है।

Category.where(:id => 1) 
# Is Equivalent to Category.all(:conditions => {:id => 1}}) 
Category.where(:id => 1).first 
# Is equivalent of Category.first(:conditions => {:id => 1}}) 

वस्तुओं केवल प्राप्त किए गए हैं जब पहली जैसे विशेष तरीकों, प्रत्येक आदि कहा जाता है। इसे आलसी लोडिंग कहा जाता है जो कि जब आप अपने विचारों को कैश करना चाहते हैं तो यह बहुत अच्छा होता है। here क्यों के बारे में और पढ़ें।

+4

वोट दें क्योंकि यह बराबर नहीं है। 'जहां' ActiveRecord :: रिलेशन देता है, जबकि बाकी ऐरे या Model.class –

+2

देता है यह संदर्भ में बराबर है। यही कारण है कि मैंने आलसी लोडिंग का उल्लेख किया। लेकिन हाँ, '.where.all' बराबर होगा। – Swanand

6
Category.where(:id => 1).recipes 

एक सरणी देता है। यदि आप बस Category.where(:id => 1).first.recipes करते हैं तो इसे काम करना चाहिए।

3

लेकिन अगर आप आईडी के खिलाफ एक जहां कर रहे हैं, खोज विधि Category.find(1) का प्रयोग कर एक श्रेणी वस्तु वापस आ जाएगी।
तो:
Category.find(1).recipes

संबंधित मुद्दे