2015-10-10 20 views
2

我有事件模型以下屬性的列的數學運算(我引用唯一的問題相關的屬性),該模型是由API調用週期性地填充,調用外部服務(谷歌日曆):如何做分組的行

colorid: number # (0-11) 
event_start: datetime 
event_end: datetime 

我需要統計分組活動,由colorid分組的持續時間。我有事件實例的方法來計算單個事件的持續時間:

def event_duration 
    ((event_end.to_datetime - event_start.to_datetime) * 24 * 60).to_i 
end 

現在,我需要做的是這樣的:

event = Event.group(:colorid).sum(event_duration) 

但對於我這個多年平均值的工作,只要我得到錯誤event_duration列不存在。我的想法是多一個屬性添加到事件模式「event_duration」,並計算和更新事件記錄創建時該屬性,在這種情況下,我會叫「event_duration」一欄,我可能是強麥到該屬性使用總和。但我不確定這是否合適,並且「系統解決方案」,只要我想要模型數據反映來自API調用的「原始」接收數據,並在模型數據的頂部進行所有數學和統計。

回答

1

event_duration是實例方法(未列名)。有人提出錯誤,因爲Event.sum只計算你的案件某些列

的總和,我認爲這將是更容易使用枚舉的方法

duration_by_color_id = {} 
grouped_events = Event.all.group_by(&:colorid) 
grouped_events.each do |colorid, events| 
    duration_by_color_id[colorid] = events.collect(&:event_duration).sum 
end 

來源:

+0

非常感謝,它的作品auto-magicall年。問題是,我是Rails&Ruby初學者,我不明白這個代碼,事件只是幾行。我必須特別檢查「&:something」的魔法,爲什麼使用「group_by」而不是「group」。 –

+0

@DavidLister:請檢查了這一點:[符號冒號shorcut(http://stackoverflow.com/questions/1961030/ruby-ampersand-colon-shortcut) – byakugie

+0

thanx的答覆,我花了一些時間研究。讓我總結一下,如果我得到了正確的結果: 'duration_by_color_id = {}' 初始化新散列 'grouped_events = Event.all.group_by(&:colorid)' 獲取multidim。包含所有事件的數組,這些事件由colorid DB列分組,因爲此塊將針對每個對象執行,並且我只調用colorid,這會返回行的值。 'grouped_events.each做| colorid,活動|' 開始迭代陣列。對於每個colorid鍵,我有一系列事件。 'duration_by_color_id [colorid] = events.collect(&:event_duration).sum' 給我與每個對象和值數組。 –