2012-05-25 10 views
6

मुझे पता है कि रेल के पास ActiveRecord में निर्मित सॉर्टिंग विधियां हैं, लेकिन मैं सिर्फ एक सादे पुरानी रूबी लिपि लिख रहा हूं और रिकॉर्ड को सरणी से क्रमबद्ध करना पसंद करूंगा।रुबी में तारीख को कैसे क्रमबद्ध करें (रेल नहीं)?

तिथि बहु-आयामी सरणी की कोशिकाओं में से एक में संग्रहीत की जाएगी।

मेरे लिए सबसे अच्छा तरीका यह दृष्टिकोण क्या है, तो जहां मैं सिर्फ sort_by_date कर मैं बात करने के लिए प्राप्त कर सकते हैं और मैं या तो ASC या DESC से संकेत मिलता है?

मुझे विधि sort_by_date विधि का उपयोग करने की आवश्यकता नहीं है, लेकिन विचार यह है कि मैं संग्रह पर आसानी से एक विधि कॉल करने और परिणाम प्राप्त करने में सक्षम होना चाहता हूं।

विचार?

+1

रूबी सरणी में सॉर्टिंग विधियां हैं। दस्तावेज़ पढ़ें और कुछ कोशिश करें। –

+0

कुछ और कोशिश करें जो आपको मिला है, अधिमानतः कुछ कोड जिसे स्वतंत्र रूप से चलाया जा सकता है, दूसरे शब्दों में, हमें कोड – peter

+1

दिखाएं, मुझे लगता है कि आप कुछ ऐसा चाहते हैं: arr.sort_by {| x | x.date} – texasbruce

उत्तर

10

ऐसा कुछ?

class Array 
    def sort_by_date(direction="ASC") 
     if direction == "ASC" 
     self.sort 
     elsif direction == "DESC" 
     self.sort {|a,b| b <=> a} 
     else 
     raise "Invalid direction. Specify either ASC or DESC."  
     end 
    end 
    end 

एक बहु-आयामी सरणी बस सरणियों की एक सरणी है, इसलिए 'आयाम' आप क्रमबद्ध करना चाहते पर इस विधि कहते हैं।

+0

धन्यवाद! यह काम। – marcamillion

12
def sort_by_date(dates, direction="ASC") 
    sorted = dates.sort 
    sorted.reverse! if direction == "DESC" 
    sorted 
end 
+0

यह एक दिलचस्प समाधान है ... धन्यवाद! – marcamillion

+0

<3 यह तरीका क्लीनर – shime

2

निम्नलिखित ऑब्जेक्ट के लिए काम नहीं कर सकता है, लेकिन डेटटाइम ऑब्जेक्ट्स के लिए काम करना चाहिए। ऐसा इसलिए है क्योंकि डेटटाइम ऑब्जेक्ट्स को पूर्णांक में परिवर्तित किया जा सकता है।

मुझे हाल ही में डेटटाइम ऑब्जेक्ट्स के लिए अवरोही क्रम करना पड़ा और यही वह है जो मैं आया था।

def sort_by_datetime(dates, direction="ASC") 
    dates.sort_by { |date| direction == "DESC" ? -date.to_i : date } 
end 
2

तरह से मैं यह सही कर रहा हूँ अब यह है:

@collection.sort! { |a,b| DateTime.parse(a['date']) <=> DateTime.parse(b['date']) } 

और के साथ! ऑपरेटर मैं एक ही चर को प्रभावित कर रहा हूं (अन्यथा मुझे संशोधित चर को पकड़ने के लिए एक और की आवश्यकता होगी)। अब तक, यह एक आकर्षण के रूप में काम कर रहा है।

+1

सुरुचिपूर्ण समाधान – iGallina

+1

'# sort_by' का उपयोग करके ब्लॉक के आधार पर मूल्यों को स्पष्ट रूप से परिवर्तित करता है। तो यह अधिक स्मृति का उपयोग करेगा, लेकिन यह हर तुलना में पार्स को भी कॉल नहीं करेगा। – kjprice

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