2016-07-14 18 views
2

私は単純な分析チャートを作成しています。リアルタイムで大量のクエリを避けるため、これらの統計専用のテーブルにキャッシュ結果データセットを保存する必要があります。Ruby:ハッシュの中に配列を作成するために配列をハッシュするには

どのユーザーもコースを試していますが、ステータスを使用してコースのIDを保存したいとします。だから、

{ "invited": [1,3,6], "done": [2,9] } 

のようなものは、私が

u.courses.map { |w| [w.status, []<<w.id] }.to_h 

この関数を書いたが、もちろん、すべての反復が私の配列がそのように初期化され、私は

u.courses.map { |w| [w.status, []<<w.id] } 
にしようとした場合、私は

{"invited"=>[5101]} 

を持っています

私は

[["invited", [1]], ["invited", [748]], ["invited", [1445]], ["invited", [2113]], ["invited", [2833]], ["invited", [6017]], ["invited", [4146]], ["invited", [5101]]] 

最初の繰り返しで配列をマップ内に保持するにはどうすればできますか?

+0

"[mcve]"をお読みください。問題を示す最小限のコード、関連する最小限の入力と予想される出力が必要です。私たちは 'u'が何であるか、'コース 'も知りません。私たちは推測することができますが、私たちはあなたに私たちを示すべきではありません。 –

答えて

2

あなたは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} 
0
u.course.each_with_object({}) { |course, h| 
    h.update(course.status=>[course.id]) { |_,o,n| o+n } } 

これは、値を決定するためにブロック({ |_,o,n| o+n })を採用(別名merge!Hash#updateの形式を使用しています両方のハッシュに存在するキーをマージします。最初のブロック変数は共通キーです。これはブロック計算では使用されていないため、一般的な例であるアンダースコアで表現しています。他の2つのブロック変数については、updateのドキュメントを参照してください。

関連する問題