我正在尝试为时间序列数据创建数据可视化网站。
我希望用户能够上传自己的csv时间序列数据。这样我的Web应用程序就可以从中创建图形。
用户可以拥有的字段数量应该是可变的。用户可以只有temperature
,或者他可以拥有temperature
和humidity
。我想只使用一个模型来处理可变数量的字段。模板模型可能吗?
我认为这里的问题是ActiveRecord和我想要的方式。我可能不得不为每个用户想要处理不同数量字段的表创建一个单独的模型。
使用ActiveRecord有更好的方法来处理吗?建议?我迷路了,我根本无法前进。任何帮助表示赞赏。
谢谢, EJAY
编辑:
我想到的另一个是代表每个数据列的模型。这样每个实例都包含相同的数字属性。像:name, :type, :timestamp, :data
这样的东西。但是,这似乎非常低效,因为我必须访问许多表才能上传一个csv文件。
这是我应该考虑的正确方法吗?
答案 0 :(得分:1)
我的建议只有模型,称为DataSet
。 DataSet
有三列,:name
,:data
和:user_id
。 :name
的类型应该类似于varchar(255)
。 :data
的类型只是text
,其目的是存储表示CSV的json blob。
假设CSV看起来像这样:
num,value
1,4
2,5
3,4
4,100
5,60
您将此解析为一个看起来像这样的哈希
{
1 => 4,
2 => 5,
3 => 4,
4 => 100,
5 => 60
}
如果要将其写入数据库,只需执行以下操作:
DataSet s = DataSet.new
s.name = 'Whatever'
s.data = parse_csv(csv_file).to_json # "{\"1\":4,\"2\":5,\"3\":4,\"4\":100,\"5\":60}"
s.save
要恢复数据,您可以执行以下操作:
ActiveSupport::JSON.decode s.data
您可以编辑模型以自动执行此转换:
class DataSet < ActiveRecord::Base
belongs_to :user
def data=(data_hash)
write_attribute :data, data_hash.to_json
end
def data
ActiveSupport::JSON.decode read_attribute(:data)
end
end