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)
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]是。