2010-11-30 5 views
6

मैं एक OrderedHash, जवाब here कि इस तरह दिखता है से उत्पन्न होते हैं:रेल: सॉर्ट करने के लिए कैसे/फिर से आदेश एक OrderedHash

<OrderedHash {2=>"534.45",7=>"10",153=>"85.0"}> 

तो, मैं दूसरा मान द्वारा हैश सॉर्ट करने के लिए, में की जरूरत है घटते क्रम में। मैंने यह कोशिश की:

var.sort! {|a,b| b[1] <=> a[1]} 
NoMethodError: undefined method `sort!' for #<ActiveSupport::OrderedHash:0x127a50848> 

मैं इस ऑर्डरर्डश को कैसे पुन: व्यवस्थित कर सकता हूं?

+0

@ Shtééf का जवाब मेरे लिए अच्छा लग रहा है, लेकिन मैं रूबी के रूप में इलाज के गहरे लाल रंग का है और कुछ अन्य भाषा का सुझाव सकता है? यह सोचने के लिए temping है कि आप php की तरह रूबी दिखने की कोशिश कर रहे हैं, जो दुर्भाग्यपूर्ण होगा। शायद आप अगली बार हासिल करने की उम्मीद कर रहे हैं कि आप क्या समझा सकते हैं। – noodl

उत्तर

8

ठीक है, मुझे लगता है कि आप मूल उत्तर के कॉल में :order => 'sum_deal_price ASC' का उपयोग कर सकते हैं।

लेकिन क्या आप भी रूबी में यह कर सकते हैं, यह सिर्फ थोड़ा जटिल काम है:

# You can't sort a Hash directly, so turn it into an Array. 
arr = var.to_a # => [[2, "534.45"], [7, "10"], [153, "85.0"]] 
# Looks like there's a bunch of floats-as-strings in there, fix that. 
arr.map! { |pair| [pair.first, pair.second.to_f] } 
# Now sort it by the value (which is the second entry of the pair). 
arr.sort! { |a, b| a.second <=> b.second } 
# Turn it back into an OrderedHash. 
sorted_hash = ActiveSupport::OrderedHash[arr] 
+0

deal.price द्वारा आदेश काम नहीं करता प्रतीत होता है। परिणाम प्राप्त होने की तुलना में मुझे मिलने वाले परिणाम मानचित्र पर हैं। अपने दूसरे सुझाव कार्यों का उपयोग करना (सॉर्ट को छोड़कर !, मुझे {| ए, बी | बी [1] <=> एक [1]} का उपयोग करना था), लेकिन मुझे उस समय के बारे में चिंता है। मैं 80,000 रिकॉर्ड देख रहा हूं, और उन्हें आगे और पीछे ले जाने में काफी समय लगता है। –

+0

ओह, अच्छा पकड़ो। सॉर्ट कॉल फिक्स्ड। मुझे यकीन नहीं है कि यह काम करेगा, लेकिन क्या आप 'ऑर्डर =>' sum_deal_price'' कोशिश कर सकते हैं? (या लॉग में जांचें कि SUM परिणाम कॉलम को क्या उपनाम नाम असाइन किया गया है।) –

+0

ऐसा किया गया। मैं उन मानों को वापस करने में सक्षम था जो मुझे केवल एक एसक्यूएल कथन के साथ जरूरी था। धन्यवाद! –

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