根据时间块创建结果数组

时间:2015-06-24 20:31:59

标签: postgresql datetime ruby-on-rails-4

我有一个应用程序,它会保存很多sensor_events;我希望通过约会得到结果,然后将这些结果映射到15分钟的块...这与在postgres中进行分组不同,因为这只会返回平均值,我需要特定的事件......

我正在考虑的是,有一天我得到了开始_of_day并将其拆分为15分钟的块作为数组哈希的关键,即

    def return_time_chunk_hash
    t=Date.today
    st = t.beginning_of_day
    times = Hash.new
    while st<t.end_of_day
        times[st.to_formatted_s(:time)] = Array.new
        st = st + 15.minutes
    end
    return times
end

然后我将比较sensor_events created_at日期,找到它所属的那个桶并将其放入那里。一旦我得到它,我知道一个块是否有任何(.count),如果是这样,可以对特定事件进行所有数据操作。

这看起来有点疯狂吗?有没有更简单的方式我没有看到?

更新 我喜欢jgraft思考的方式,但认为它不会工作,因为我必须根据组列标志进行多个查询,但后来我想到了Enumerable的group_by所以我在实际的SensorEvent模型中尝试了类似的东西:

def chunk
    Time.at((self.created_at.to_f / 15.minutes).floor * 15.minutes).to_formatted_s(:time)
end

这允许我像往常一样获得我需要的所有传感器事件(即@se=SensorEvent.where(sensor_id: 10)),但随后我可以@se.group_by(&:chunk),我将这些奇异事件分组为哈希,即:

    {"13:30"=>
  [#<SensorEvent:0x007ffac0128438
    id: 25006,
    force: 0.0,
    xaccel: 502.0,
    yaccel: 495.0,
    zaccel: 616.0,
    battery: 0.0,
    position: 25.0,
    created_at: Thu, 18 Jun 2015 13:33:37 EDT -04:00,
    updated_at: Thu, 18 Jun 2015 15:51:32 EDT -04:00,
    deviceID: "D36330135FE3D36",
    location: 3,
    sensor_id: 10>,
   #<SensorEvent:0x007ffac0128140
    id: 25007,
    force: 0.0,
    xaccel: 502.0,
    yaccel: 495.0,
    zaccel: 616.0,
    battery: 0.0,
    position: 27.0,
    created_at: Thu, 18 Jun 2015 13:39:46 EDT -04:00,
    updated_at: Thu, 18 Jun 2015 15:51:32 EDT -04:00,
    deviceID: "D36330135FE3D36",
    location: 3,
    sensor_id: 10>,
   .........

麻烦当然不是每一块时间都可以创建,因为没有事件可以产生它;还有一个哈希它还没有排序:

res.keys
=> ["13:30",
 "13:45",
 "14:00",
 "13:00",
 "15:45",
 "16:00",
 "16:15",
 "16:45",
 "17:00",
 "17:15",
 "17:30",
 "14:15",
 "14:30",

我必须对事件块进行计算;我可能会保留一个主TIMECHUNKS数组来按顺序比较/查找...

1 个答案:

答案 0 :(得分:0)

为什么不在sensor_events表中添加一列来指定它属于哪个块?基本上会给你一个数组,因为你可以进行如下查询:

SensorEvent.where(date: Date.today, block: 1)

并以数组格式返回数据的关系。

您只需向设置SensorEvents列的block模型添加after_create回调。

class SensorEvent < ActiveRecord::Base
  after_create :set_block

  private

  def set_block
    value = ((4 * created_at.hour) + (created_at.min.to_f / 15).ceil).to_i
    self.update_columns(block: value)
end