我是rails的新手,我认为这是常见的问题。目前,我在rails中有两种不同的方法来获取今天和每周的数据。然后,我过滤数据,在today方法中找到每小时的最大值,在week方法中找到每一天的最大值,并相应地返回json对象。
现在我想从我的rest api中删除限制,通过编写一个方法来查找两个日期之间的差异,并找到它们之间的间隔,差异可以是分钟,小时,天等,然后差异将被分成10个相等的部分,并找到提取该特定部分的最大值。例如,如果部件间隔为10分钟,那么我需要每个部件的最大值,类似于几个小时或一天。
发现差异很容易,但我不知道如何进一步处理,任何指针,请,我强烈相信,许多人经历过类似的问题,如果我能得到任何良好的指针基本上在rails将是很好的。
我的日期时间格式是
Mon Jun 23 16:00:06 2014 GMT 0200发布于 2014-11-15 22:09:22
只要秒数足够精确,你就可以通过简单的减法来比较两个DateTime对象:
a = DateTime.new(2014) # Wed, 01 Jan 2014 00:00:00 +0000
b = DateTime.new(2015) # Thu, 01 Jan 2015 00:00:00 +0000
diff = b.to_i - a.to_i # in seconds.
puts "2014 has #{ (diff / 1.day).round } days"ActiveSupport提供了一些方法,我们可以在这些方法上将整数转换为时间,这使得添加十分之一的差变得非常容易
puts "a tenth into 2014 is #{ a + (diff / 10).seconds }"您可以使用将一系列DateTime对象传递给where子句:
Foo.where(created_at: a..(a + (diff / 10).seconds))因此,总结一下:
class Foo < ActiveRecord::Base
# Get the maximum value of bar column
# for divided into periods between a start and end date.
# @param start [DateTime]
# @param finish [DateTime]
# @param divisor [Integer] the number of parts to split into
# @return array
# will always have divisor number of elements
# elements may be empty
def maximum_bar_values_for_period(start, finish, divisor = 10)
diff = finish.to_i - start.to_i
part = diff / divisor
(0..divisor).map do |i|
start_period = start + ((i - 1) * part).seconds
end_peroid = start_period + part.seconds
Foo.where(created_at: start_period..end_peroid).maximum(:bar)
end
end
endhttps://stackoverflow.com/questions/26945640
复制相似问题