在嵌套哈希中使用 group by 和 sort by

Jac*_*rby 3 ruby sorting hash group-by ruby-on-rails

我有一个功能:

tracks.group_by { |t| t[:track].track_category }
Run Code Online (Sandbox Code Playgroud)

这会创建一个哈希:

{ 

 #<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}]
}
Run Code Online (Sandbox Code Playgroud)

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

这不断给我带来错误,而且我确信我做错了什么

tracks.group_by { |t| t[:track].track_category }.sort_by { |t| t[:order] }.sort_by { |t| t[:promo_order] }
Run Code Online (Sandbox Code Playgroud)

Leo*_*ito 5

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}],
 #...
]
Run Code Online (Sandbox Code Playgroud)

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

tracks.group_by { |t| t[:track].track_category }
  .sort_by { |t, _| t[:order] } # here you're sorting by TrackCategory#[:order]
Run Code Online (Sandbox Code Playgroud)

第二行有类似的内容,但使用的[:promo_order]是。