如何在Rails中为心电(ECG)时序数据创建Mongoid模型及关联ActiveModel?
Mongoid存储时序ECG数据及ActiveModel关联方案
一、Mongoid存储时序ECG数据
ECG作为时序数据,核心是时间戳+数值的结构,在Mongoid里有两种常用存储方案,可根据数据量和查询场景选择:
1. 嵌入文档(适合单用户ECG数据量中等场景)
将ECG数据直接嵌入User文档中,查询时无需跨集合关联,性能更优:
# app/models/user.rb class User include Mongoid::Document embeds_many :ecgs, cascade_callbacks: true # 级联回调可选,删除用户时同步删除ECG end # app/models/ecg.rb class Ecg include Mongoid::Document embedded_in :user field :timestamp, type: Time # 时序核心字段:时间戳 field :value, type: Float # ECG数值 index({ timestamp: 1 }) # 给时间戳加索引,优化时序范围查询 end
2. 独立集合+引用(适合单用户ECG数据量极大场景)
当单用户ECG数据达到百万级以上时,用独立集合存储,通过user_id关联:
# app/models/user.rb class User include Mongoid::Document has_many :ecgs end # app/models/ecg.rb class Ecg include Mongoid::Document belongs_to :user field :timestamp, type: Time field :value, type: Float index({ user_id: 1, timestamp: 1 }) # 联合索引,优化按用户+时间范围的查询 end
时序查询示例
无论哪种方案,都可以快速查询指定时间范围的ECG数据:
# 查询某用户最近24小时的ECG数据(按时间升序) user.ecgs.where(timestamp: (24.hours.ago)..Time.now).asc(:timestamp)
二、ActiveModel与Mongoid关联
如果你的User是基于普通数据库的ActiveModel(或ActiveRecord)模型,要和Mongoid的ECG模型关联,可通过ID映射实现:
场景1:User是ActiveRecord模型
# app/models/user.rb(ActiveRecord) class User < ApplicationRecord # 自定义方法关联Mongoid的ECG def ecgs Ecg.where(user_id: self.id.to_s) # 注意:将ActiveRecord的ID转为字符串(Mongoid默认存储字符串ID) end end # app/models/ecg.rb(Mongoid) class Ecg include Mongoid::Document field :user_id, type: String # 存储ActiveRecord User的ID字符串 field :timestamp, type: Time field :value, type: Float index({ user_id: 1, timestamp: 1 }) # 反向关联:从ECG获取对应的ActiveRecord User def user User.find(self.user_id) end end
场景2:User是纯ActiveModel模型
如果User不是ORM模型,仅实现ActiveModel接口,关联逻辑类似:
# app/models/user.rb(纯ActiveModel) class User include ActiveModel::Model attr_accessor :id, :name # ActiveModel必要方法:标识是否已持久化 def persisted? !id.nil? end # 获取关联的ECG数据 def ecgs Ecg.where(user_id: self.id) end end # app/models/ecg.rb(Mongoid) class Ecg include Mongoid::Document field :user_id, type: String field :timestamp, type: Time field :value, type: Float # 反向获取User(需自行实现User的find逻辑) def user User.find(self.user_id) end end
注意事项
- ID类型匹配:如果ActiveModel的ID是整数,Mongoid的
user_id字段要设为type: Integer;如果是UUID,保持String类型即可。 - 跨数据源事务:ActiveModel(或ActiveRecord)和Mongoid属于不同数据库,无法使用跨库事务,需手动处理数据一致性。
内容的提问来源于stack exchange,提问作者Dwarknight
相关产品推荐
相关产品推荐

