2

私は現在、次のような出力を作成するRubyコードをいくつか持っています(JSONへの変換後):

"days": [
    {
        "Jul-22": ""
    },
    {
        "Aug-19": ""
    }
],

私が欲しいのは、次のような出力です:

"days": {
    "Jul-22": "",
    "Aug-19": ""
},

これが私のコードです:

CalendarDay.in_the_past_30_days(patient).select(&:noteworthy?).collect do |noteworthy_day|
  { noteworthy_day.date.to_s(:trends_id) => "" }
end

つまり、ハッシュの配列ではなくハッシュが必要です。これが私の醜い解決策です:

days = {}
CalendarDay.in_the_past_30_days(patient).select(&:noteworthy?).each do |noteworthy_day|
  days[noteworthy_day.date.to_s(:trends_id)] = ""
end 
days

しかし、それは非常にルビーらしくないようです。誰かがこれをより効率的に行うのを手伝ってくれますか?

4

2 に答える 2

2
Hash[
  CalendarDay.in_the_past_30_days(patient).select(&:noteworthy?).collect { |noteworthy_day|
    [noteworthy_day.date.to_s(:trends_id), ""]
  }
]

または...

CalendarDay.in_the_past_30_days(patient).select(&:noteworthy?).each_with_object(Hash.new) { |noteworthy_day, ndays|
  ndays[noteworthy_day] = ""
}
于 2013-08-20T15:53:59.670 に答える
0

これは、テーラーメードの問題ですEnumerable#inject

CalendarDay.in_the_past_30_days(patient).select(&:noteworthy?).inject({}) do |hash, noteworthy_day|
    hash[noteworthy_day.date.to_s(:trends_id)] = ''
    hash
end
于 2013-08-20T17:54:59.657 に答える