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

时间:2017-03-29 02:06:35

标签: ruby-on-rails ruby sorting hash group-by

我有一个功能:

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] }

1 个答案:

答案 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]