允许用户在模板化模型中创建自己的属性

时间:2013-11-18 02:34:30

标签: ruby-on-rails activerecord csv time-series

我正在尝试为时间序列数据创建数据可视化网站。

我希望用户能够上传自己的csv时间序列数据。这样我的Web应用程序就可以从中创建图形。

用户可以拥有的字段数量应该是可变的。用户可以只有temperature,或者他可以拥有temperaturehumidity。我想只使用一个模型来处理可变数量的字段。模板模型可能吗?

我认为这里的问题是ActiveRecord和我想要的方式。我可能不得不为每个用户想要处理不同数量字段的表创建一个单独的模型。

使用ActiveRecord有更好的方法来处理吗?建议?我迷路了,我根本无法前进。任何帮助表示赞赏。

谢谢, EJAY

编辑: 我想到的另一个是代表每个数据列的模型。这样每个实例都包含相同的数字属性。像:name, :type, :timestamp, :data这样的东西。但是,这似乎非常低效,因为我必须访问许多表才能上传一个csv文件。

这是我应该考虑的正确方法吗?

1 个答案:

答案 0 :(得分:1)

我的建议只有模型,称为DataSetDataSet有三列,: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