如何使用分组行上的列进行数学运算

时间:2015-10-10 21:42:56

标签: sql ruby-on-rails ruby-on-rails-4 activerecord model

我的事件模型包含以下属性(我只引用与问题相关的属性),此模型由API调用定期填充,调用外部服务(Google日历):

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”的列,我可能会对此属性使用sum。但我不确定这是好的和“系统解决方案”,只要我希望模型数据反映来自API调用的“原始”接收数据,并在模型数据的顶部进行所有数学和统计。

1 个答案:

答案 0 :(得分: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

来源: