我有一个应用程序,它会保存很多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数组来按顺序比较/查找...
答案 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