Ошибка в Rails multi sort_by при попадании пустого значения даты - PullRequest
1 голос
/ 20 декабря 2010

Простите за новый вопрос, всем. Вот оно:

У меня есть хеш, который выглядит так:

{ "id" => { :task => [ { :due => Mon Dec 20 00:00:00 UTC 2010, completed: => "2010-12-18T17:29:57Z", :priority => "1", ... } ] , ... } , ... }

Для сортировки я использую:

tasks = hash.with_indifferent_access

tasks.sort_by { |k,v| [ v['task'][0]['completed'], v['task'][0]['due'], v['task'][0]['priority'] ] }

Это прекрасно работает, если: срок имеет значение даты. Когда у него нет значения даты, что разрешено, оно выглядит так:

:due => ""

Затем я получаю сообщение об ошибке Rails, говорящее: «Не удалось сравнить массив с массивом».

Я попытался установить в троичной и другой логике значение по умолчанию для далекой даты, если: срок пуст, но кажется, что это невозможно в блоке sort_by.

Есть идеи, как лизать этот? Большое спасибо!

1 Ответ

1 голос
/ 21 декабря 2010

Вот пример, в котором предполагается, что «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"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...