所以我也有我命令調用排序上排序在一個新的領域
all.sort {|a,b| b.time<=> a.time}
現在最近我添加了一個新的領域,以我的對象包括「UPLOADED_AT」時間事件的數組。我想首先按「時間」和「上傳時間」排序(因爲「時間」字段很簡單,沒有任何時間的日期)
我需要記住所有舊的「事件」 (我不關心具有相同時間的兩個事件的順序並且沒有上傳的值
所以我也有我命令調用排序上排序在一個新的領域
all.sort {|a,b| b.time<=> a.time}
現在最近我添加了一個新的領域,以我的對象包括「UPLOADED_AT」時間事件的數組。我想首先按「時間」和「上傳時間」排序(因爲「時間」字段很簡單,沒有任何時間的日期)
我需要記住所有舊的「事件」 (我不關心具有相同時間的兩個事件的順序並且沒有上傳的值
嘗試一些東西,但是這個方法不可能存在,所以這個方法不可能存在。是這樣的:
all.sort_by { |x| [x.time, (x.uploaded_at rescue Time.utc(1970))] }
你將會有一定的照顧來處理uploaded_at
的nil
值的問題是x <=> nil
和nil <=> 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
秒。
當我這樣做時,它會產生一個NoMethodError! – Steve 2012-01-08 19:30:37
好吧我編輯它,所以看到我的新答案 – 2012-01-08 19:32:00
我不認爲你可以比較陣列與'nil's,它應該設置一個默認的基準時間,例如:'[x.time,x.respond_to?( :uploaded_at)? x.uploaded_at:Time.utc(1970)]' – tokland 2012-01-08 19:36:19