当您有一个nil值和多种排序时如何使用sort_by

时间:2018-07-09 15:15:29

标签: ruby

我有一个调用数组,我想先按Scheduled_date排序,然后再按Triggerd_date排序。

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date] }

因为trigger_date有时是一个零值,所以我得到了错误 #<ArgumentError: comparison of Array with Array failed>

我该如何对零值进行分类?我已经搜索了一些示例,但是找不到与我相似的东西。例如,我尝试过

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date] } rescue nil

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date] || call.scheduled_date }

但是它们不起作用。我见过<=>用于sort_by,但不确定在有多种排序的情况下如何使用它。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果您为可能缺失的triggered date(具有注释中提到的call.scheduled_date.end_of_day)具有首选替换值,则可以执行以下操作:

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date || call.scheduled_date.end_of_day] }

然后,如果存在,则数组的第二个条目为triggered_date,如果call.scheduled_date.end_of_daytriggered_date,则为nil

旧答案:

如果您希望nil部分仅被排序忽略(其结果是,将带有triggered_date == nil的那些条目视为比带有当前triggered_date的那些条目“小”,您可以可以执行以下操作:

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date].compact }

compact从数组中删除nil值。因此,没有triggered_date的调用只有一个大小为1的数组用于比较,而其他的则有大小为2。在这里,空缺似乎会获胜,因此这些排序在其他任何列表的前面。

请注意scheduled_date也可能是nil!然后,这种方法可能会导致非常奇怪的结果。

已编辑:如果已知可能的故障,则添加了解决方案