在嵌套哈希中使用分组依据和排序依据

杰克泽比

我有一个功能:

tracks.group_by { |t| t[:track].track_category }

这会创建一个哈希:

{ 

 #<TrackCategory id: 2, order: 0> => 
  [{:track => 
     #<Track promo_order: 2>,
    :order => 2},
   {:track => 
     #<Track promo_order: 2>,
    :order => 1}],

 #<TrackCategory id: 1, order: 1> => 
  [{:track => 
     #<Track promo_order: 2>,
    :order => 2},
   {:track => 
     #<Track promo_order: 2>,
    :order => 1}]
}

我一直在尝试按顺序对 TrackCategories 进行排序,并在其中按 promo_order 对 Tracks 进行排序。

这一直给我错误,我很确定我做错了什么

tracks.group_by { |t| t[:track].track_category }.sort_by { |t| t[:order] }.sort_by { |t| t[:promo_order] }
里奥·布里托

您正在传递一个来自group_by并被强制作为数组sort_by的键值,然后尝试访问数组中的键,该键当然不存在。

换句话说,您误解了 sort_by 中使用的输入。第一个sort_by,|t|是由 group_by 生成的散列密钥对,并被强制转换为形式为 的数组[k,v]在你的情况下,t是:

[ #<TrackCategory id: 2, order: 0>,
  [{:track => 
     #<Track promo_order: 2>,
    :order => 2},
   {:track => 
     #<Track promo_order: 2>,
    :order => 1}],
 #...
]

所以你想要的是在元素中分解数组,这样你就可以获得你想要的元素,比如:

tracks.group_by { |t| t[:track].track_category }
  .sort_by { |t, _| t[:order] } # here you're sorting by TrackCategory#[:order]

和第二行类似的东西,但使用[:promo_order]代替。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章