Вот пример, в котором предполагается, что «due» является строкой, и если она пуста, вы хотите, чтобы она сортировалась перед другими задачами с тем же значением завершения. Идея состоит в том, чтобы преобразовать как действительные даты, так и пустые строки в один и тот же сопоставимый тип данных (в данном случае целое число секунд с начала эпохи). Я намеренно проигнорировал детали вашей настройки, которые не имеют отношения к вашему вопросу.
# Required for Time.parse
require 'time'
tasks = [
{
completed: "2010-12-18T17:29:57Z",
due: "Mon Dec 20 00:00:00 UTC 2010",
priority: "1"
},{
completed: "2010-12-18T17:29:57Z",
due: "Mon Dec 20 00:00:00 UTC 2010",
priority: "2"
},{
completed: "2010-12-18T17:29:57Z",
due: "",
priority: "1"
},{
completed: "2010-12-17T17:29:57Z",
due: "Mon Dec 20 00:00:00 UTC 2010",
priority: "1"
},{
completed: "2010-12-19T17:29:57Z",
due: "Mon Dec 20 00:00:00 UTC 2010",
priority: "1"
}
]
require 'pp'
pp tasks.sort_by{ |h| [
Time.parse(h[:completed]),
h[:due].empty? ? 0 : Time.parse(h[:due]).to_i,
h[:priority].to_i
]}
#=> [{:completed=>"2010-12-17T17:29:57Z",
#=> :due=>"Mon Dec 20 00:00:00 UTC 2010",
#=> :priority=>"1"},
#=> {:completed=>"2010-12-18T17:29:57Z", :due=>"", :priority=>"1"},
#=> {:completed=>"2010-12-18T17:29:57Z",
#=> :due=>"Mon Dec 20 00:00:00 UTC 2010",
#=> :priority=>"1"},
#=> {:completed=>"2010-12-18T17:29:57Z",
#=> :due=>"Mon Dec 20 00:00:00 UTC 2010",
#=> :priority=>"2"},
#=> {:completed=>"2010-12-19T17:29:57Z",
#=> :due=>"Mon Dec 20 00:00:00 UTC 2010",
#=> :priority=>"1"}]