2009-06-10 7 views
5

यह सवाल काफी सरल है लेकिन मैंने समस्या में कुछ बार भाग लिया है।रूबी ऑन रेल में सक्रिय रिकॉर्ड ऑब्जेक्ट्स पर आप कैसे पुन: प्रयास करते हैं?

के आप की तरह कुछ करना मान लीजिए:

cars = Vehicle.find_by_num_wheels(4) 

cars.each do |c| 
    puts "#{c.inspect}" 
end 

यह ठीक काम करता है, तो कारों एक सरणी है, लेकिन अगर वहाँ डेटाबेस में केवल एक ही कार है विफल रहता है। जाहिर है, मैं कुछ कर सकता हूं जैसे "अगर! Cars.length.nil?" या किसी अन्य तरीके से जांचें यदि कार ऑब्जेक्ट कॉल करने से पहले एक सरणी है। लेकिन, यह हर बार करने के लिए थोड़ा परेशान है।

क्या ऐसा कुछ है जो आपके लिए इस चेक को संभालता है? या आकार के बावजूद क्वेरी परिणाम को सरणी में बल देने का कोई आसान तरीका है?

उत्तर

12

आप के लिए

cars = Vehicle.find_all_by_num_wheels(4) 

देख जा सकता है गतिशील find_by_ तरीकों केवल एक ही तत्व की वापसी और find_all_by_ उपयोग करने के लिए एक से अधिक वापस लौटाना होगा।

2

आप हमेशा कारों के सभी चाहते हैं, आप के बजाय find_all उपयोग करना चाहिए:

cars = [cars] unless cars.respond_to?(:each) 
0

आप को यह कर सकते हैं:

cars = Vehicle.find_all_by_num_wheels(4) 

आप किसी एकल Vehicle एक सरणी में साथ बदल सकती है हर बार सरणी प्राप्त करें:

cars = Vehicle.find(:all, :conditions => {num_wheels => 4}) 

मुझे नहीं लगता कि आपके पास है एक लूप जो जांच करेगा कि ऑब्जेक्ट एक सरणी है या नहीं।

एक अन्य समाधान हो सकता है:

for i in (1..cars.lenght) 
    puts cars[i].inspect 
end 

(परीक्षण नहीं किया है, यह एक स्ट्रिंग पर लंबाई का परीक्षण करने के तोड़ सकता मुझे पता है अगर यह होता है करते हैं।)

2

के लिए नामांकित scoped संस्करण अपने समस्या

Vehicle.scoped(:conditions => { :num_wheels => 4 }).each { |car| car.inspect } 
+0

मुझे लगता है कि यह एक अज्ञात गुंजाइश होगा, यह देखकर कि आपने इसका नाम कैसे नहीं दिया। हालांकि, इस के लिए स्कोप्स एक अच्छा जवाब है। – Chuck

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