Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从不同实例中查找时间的聚合_Ruby On Rails_Ruby_Datetime_Aggregate - Fatal编程技术网

Ruby on rails 从不同实例中查找时间的聚合

Ruby on rails 从不同实例中查找时间的聚合,ruby-on-rails,ruby,datetime,aggregate,Ruby On Rails,Ruby,Datetime,Aggregate,我有一个名为WorkInterval的模型,它的记录基本上包含: start_date, end_date 我希望能够获得特定任务的所有工作间隔,我知道如何处理关联,并获得所花费的总时间。因此,对所有实例的end_date和start_date end_date-start_date之间的所有差异进行聚合相加 现在我能够做到这一点: @task.work\u interval->它为我提供了所有的工作时间间隔,但我如何才能以一种干净的ruby方式获得在该任务上花费的时间总和 注意: 1-结束日

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

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

现在我能够做到这一点:

@task.work\u interval->它为我提供了所有的工作时间间隔,但我如何才能以一种干净的ruby方式获得在该任务上花费的时间总和

注意: 1-结束日期和开始日期都是日期时间。
2-某些实例的结束日期可能为NIL,如果是这种情况,则应采用当前日期时间。

以下是一个提示,在任务模型中定义如下函数:

@task.work_intervals
.map {|i| (i.end_date || Time.now).to_time - i.start_date.to_time }
.reduce(:+)
# => total in seconds
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。。。希望这有助于

[更新]

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

我的测试是用posgresql中数据库的一条实际记录完成的,表列最初创建为datetime,但我不知道在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 

以下是一个提示,在您的任务模型中定义了如下函数:

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。。。希望这有助于

[更新]

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

我的测试是用posgresql中数据库的一条实际记录完成的,表列最初创建为datetime,但我不知道在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 

德本胡尔,谢谢你的回答。很抱歉,我刚刚编辑了这个问题,因为可能有些工作时间间隔的结束日期为零,而那些结束日期为零的工作时间间隔应该将当前日期作为结束日期。然后执行:{I | I.end | DateTime.now-I.start | date}dbenhur为什么要执行.to |time?如果我已经有了DateTime实例?@HommerSmith,因为计算时间会产生秒作为Fixnum,但减去DateTimes会产生天作为Rational。@HommerSmith ruby-rdate-e'puts DateTime.now-DateTime.now.class'=>Rational在rubies 2.0.0、1.9.3、1.8.7下。也许您有一些monkeypatching DateTime-库,但是rational是默认行为。dbenhur,谢谢您的回答。很抱歉,我刚刚编辑了这个问题,因为可能有些工作时间间隔的结束日期为零,而那些结束日期为零的工作时间间隔应该将当前日期作为结束日期。然后执行:{I | I.end | DateTime.now-I.start | date}dbenhur为什么要执行.to |time?如果我已经有了DateTime实例?@HommerSmith,因为计算时间会产生秒作为Fixnum,但减去DateTimes会产生天作为Rational。@HommerSmith ruby-rdate-e'puts DateTime.now-DateTime.now.class'=>Rational在rubies 2.0.0、1.9.3、1.8.7下。也许你有一些库是monkeypatching DateTime-,但是rational是默认的行为。该死,那是一些丑陋的Ruby。使用两个空格的缩进,在不需要时避免使用uvars,跳过不必要的self,使用适当的枚举方法,而不是每个方法和累加器。而且,它也不起作用。你不能从一个时间中减去一个DateTime,而且你也不能真正地累积这些值。嗯,很抱歉,我在答案中写的代码是正确的,它确实给出了从取消开始日期到结束日期的小时数,显然是一个整数,如果你想让天数使用1.day。。。我已经试过了,如果我不确定该怎么做,我不会给出答案……你现在正在评估代码缩进吗?还是你在寻找答案?何塞:不要找借口。很明显,我不是在寻找答案,我比你早几个小时提供了一个更好的样式&正确性。即使您的编辑应该已经到位,而不是postscript,当结束日期为空时,您的代码示例仍然会抛出一个TypeError。如果你脸皮很薄,在提出建设性的批评时必须抱怨,也许你不应该向公众提供代码示例?我很抱歉试图提供帮助,显然我不是Rails方面的专家,我也不想赢得声誉,但当有人请求帮助,我可以提供一些东西时,我会这样做,我已经在我的控制台上证明了这一点,那是一些丑陋的红宝石。使用两个空格的缩进,在不需要时避免使用uvars,跳过不必要的self,使用适当的枚举方法,而不是每个方法和累加器。而且,它也不起作用。你不能从一个时间中减去一个DateTime,而且你也不能真正地累积这些值。嗯,很抱歉,我在答案中写的代码是正确的,它确实给出了从取消开始日期到结束日期的小时数,显然是一个整数,如果你想让天数使用1.day。。。我已经试过了,如果我不确定该怎么做,我不会给出答案……你现在正在评估代码缩进吗?还是你在寻找答案?何塞:不要找借口。我显然不是在寻找答案,我提供了一个答案
更好的一种风格&比你的好几个小时。即使您的编辑应该已经到位,而不是postscript,当结束日期为空时,您的代码示例仍然会抛出一个TypeError。如果你脸皮很薄,在提出建设性的批评时必须抱怨,也许你不应该向公众提供代码示例?我很抱歉试图提供帮助,显然我不是Rails方面的专家,我也不想赢得声誉,但当有人请求帮助,我可以提供一些东西时,我会这样做,我已经在我的控制台上证明了这一点