Вам придется обрабатывать значения nil
в uploaded_at
с некоторой осторожностью. Проблема в том, что x <=> nil
и nil <=> x
будут nil
, кроме случаев, когда x.nil?
, а для сортировки требуется оператор <=>
, чтобы вернуть Fixnum.
Один из вариантов - сопоставить nil
s с некоторыми значениями, отличными от 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
s там, где вы хотите.