查找来自不同实例的时间总和

时间:2013-04-11 17:25:59

标签: ruby-on-rails ruby datetime aggregate

我有一个名为WorkInterval的模型,它基本上包含记录:

start_date, end_date

我希望能够获得特定任务的所有WorkIntervals(我知道如何处理关联)并获得花费的总时间。因此,对所有实例进行end_date和start_date(end_date - start_date)之间所有差异的聚合(添加)。

现在我能够做到这一点:

@task.work_intervals - >这给了我所有的工作间隔,但我怎样才能以干净的红宝石方式获得花在该任务上的时间总和?

注意:
1 - end_date和start_date都是 DateTime
2 - 某些实例可能将end_date设置为NIL,如果是这种情况,则应采用当前日期时间。

2 个答案:

答案 0 :(得分:0)

@task.work_intervals
.map {|i| (i.end_date || Time.now).to_time - i.start_date.to_time }
.reduce(:+)
# => total in seconds

答案 1 :(得分:-1)

这是一个提示,在你的任务模型中定义一个这样的函数:

def total_time_in_hours
 _total_time = 0
 self.work_intervals.each do |work_interval|
  _start_date = work_interval.start_date
  _end_date = work_interval.end_date
  _end_date = Time.now unless _end_date.blank?
  _total_time += ((_end_date - _start_date)/1.hour).round
 end
 _total_time
end

现在可以像@any_task.total_time_in_hours一样访问总时间...希望有助于......:)

[UPDATE]

忽略这个答案,我犯了一些错误...... :(

我的测试是在posgresql中使用我的数据库的实际记录完成的,表格列最初是作为日期时间创建的,但是当我在Rails中检索记录时,如果有什么变化,我不会知道......

1.8.7-p371 :001 > @init_date = MaterialReservacion.first.hora_limite

  => Thu, 11 Apr 2013 19:09:14 CDT -05:00

1.8.7-p371 :002 > @end_date = Time.now

  => Fri Apr 12 09:33:34 -0500 2013 

1.8.7-p371 :003 > ((@end_date-@init_date)/1.hour).round
  => 14