我正在创建一个简单的分析图表,为了避免实时的大量查询,我需要将一个缓存的结果数据集保存在一个专门用于这些统计数据的表中。
任何用户尝试某个课程,我想使用状态保存课程的ID。所以有点像
{ "invited": [1,3,6], "done": [2,9] }
我写这个函数
u.courses.map { |w| [w.status, []<<w.id] }.to_h
当然,每次迭代我的数组都是初始化的
{"invited"=>[5101]}
如果我尝试
u.courses.map { |w| [w.status, []<<w.id] }
我获得
[["invited", [1]], ["invited", [748]], ["invited", [1445]], ["invited", [2113]], ["invited", [2833]], ["invited", [6017]], ["invited", [4146]], ["invited", [5101]]]
如何在第一次迭代时创建数组,并将其保存在地图中?
最佳答案
您可以尝试each_with_object
:
u.courses.each_with_object({}){|w, o| (o[w.status] ||= []) << w.id}
或
reduce
/inject
:u.courses.reduce({}){|o, w| (o[w.status] ||= []) << w.id}