2012-05-25 296 views
6

私はRailsにActiveRecordに組み込まれたソート方法があることを知っていますが、私は単純な古いルビースクリプトを書いており、配列からレコードを日付順に並べ替えたいと思っています。Ruby(Railsではない)の日付をsort_byにする方法は?

日付は、多次元配列の1つのセルに格納されます。

私がこれに近づく最も良い方法は何ですか、私はちょうどsort_by_dateを実行し、ASCまたはDESCのいずれかを示しています。

私はメソッドsort_by_dateを使用する必要はありませんが、私は簡単にコレクションのメソッドを呼び出して、私が望む結果を得ることができるようにしたいと考えています。

思考?

+1

Ruby配列にはソート方法があります。ドキュメントを読んで何かを試してみてください。 –

+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

Dateオブジェクトでは次のように動作しない可能性がありますが、DateTimeオブジェクトでは機能するはずです。これは、DateTimeオブジェクトを整数に変換できるためです。

最近、DateTimeオブジェクトの降順ソートが必要でしたが、これは私が思いついたものです。

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

関連する問題