我有一个功能:
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] }
答案 0 :(得分:3)
您正在传递一个来自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]
。