2012-01-08 84 views
0

所以我也有我命令調用排序上排序在一個新的領域

all.sort {|a,b| b.time<=> a.time} 

現在最近我添加了一個新的領域,以我的對象包括「UPLOADED_AT」時間事件的數組。我想首先按「時間」和「上傳時間」排序(因爲「時間」字段很簡單,沒有任何時間的日期)

我需要記住所有舊的「事件」 (我不關心具有相同時間的兩個事件的順序並且沒有上傳的值

回答

2

嘗試一些東西,但是這個方法不可能存在,所以這個方法不可能存在。是這樣的:

all.sort_by { |x| [x.time, (x.uploaded_at rescue Time.utc(1970))] } 
+0

當我這樣做時,它會產生一個NoMethodError! – Steve 2012-01-08 19:30:37

+0

好吧我編輯它,所以看到我的新答案 – 2012-01-08 19:32:00

+0

我不認爲你可以比較陣列與'nil's,它應該設置一個默認的基準時間,例如:'[x.time,x.respond_to?( :uploaded_at)? x.uploaded_at:Time.utc(1970)]' – tokland 2012-01-08 19:36:19

1

你將會有一定的照顧來處理uploaded_atnil值的問題是x <=> nilnil <=> x將爲nil,除非x.nil?和排序要求<=>運算符返回Fixnum。

一種選擇是nil點地圖到一些非nil值,將永遠正確排序,Time.new(0)也許是:

all.sort_by { |a| [a.time, a.uploaded_at || Time.new(0)] } 

Array#<=>運營商組成,通過成分和上述去除nil問題。如果你想在另一端nil s那麼選擇一些大而不是Time.new(0)

另一個選項是處理手動nil S:

all.sort do |a, b| 
    x = a.time <=> b.time 
    if(x != 0) 
     x 
    elsif(a.uploaded_at.nil? && b.uploaded_at.nil?) 
     0 
    elsif(a.uploaded_at.nil?) 
     1 
    elsif(b.uploaded_at.nil?) 
     -1 
    else 
     a.uploaded_at <=> b.uploaded_at 
    end 
end 

你會的,當然,調整elsif(a.uploaded_at.nil?)elsif(b.uploaded_at.nil?)樹枝把你想讓他們的nil秒。