>我有一个调用数组,我想先按scheduled_date排序,然后再按triggered_date排序。
calls.sort_by! { |call| [call.scheduled_date, call.triggered_date] }
因为triggered_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但不确定如何在这种有多种排序的情况下使用它。任何帮助将不胜感激。
如果您对可能缺少的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
-part(效果是那些带有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
!然后这种方法会导致非常奇怪的结果。
已编辑:如果可能的回退已知,则添加了解决方案