我有一个调用数组,我想先按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,但不确定在有多种排序的情况下如何使用它。任何帮助将不胜感激。
答案 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_day
为triggered_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
!然后,这种方法可能会导致非常奇怪的结果。
已编辑:如果已知可能的故障,则添加了解决方案