【问题标题】:Using group by and sort by in nested hash在嵌套哈希中使用 group by 和 sort by
【发布时间】:2017-08-22 07:43:40
【问题描述】:

我有一个函数:

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

【问题讨论】:

  • 它给你带来了什么错误?对象是如何布置的? (即它们与其他事物的关系是什么?)

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


【解决方案1】:

您将来自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]

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2017-06-08
    • 2023-04-07
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多