在Mongoid文档中保存和获取哈希值

时间:2012-08-21 23:43:39

标签: ruby ruby-on-rails-3 hash mongoid

我正在使用以下内容创建指标哈希:

@metrics = Hash.new

...

@metrics[:users][:year][:male] = ...
@metrics[:users][:today][:male] = ...

...

Metrics.new(:metrics => @metrics).save

我有以下课程:

class Metrics
  include Mongoid::Document
  include Mongoid::Timestamps

  field :metrics, :type => Hash

  attr_accessible :metrics

  ...

end

要获取此文档,我有:

@metrics = Metrics.find(params[:id])
@metrics = @metrics[:metrics]

为了访问这些元素,我需要这样做:

@metrics['users']['year']['male']

我是否可以在访问哈希值方面保持一致但仍然在mongo中存储数据?

1 个答案:

答案 0 :(得分:1)

您使用的是什么版本的Ruby和Mongoid?通过符号访问Mongoid对象中的哈希在Mongoid 3.0.4和Ruby 1.9.3中工作正常。所以我可以这样做:

@metrics = Metrics.find(params[:id])[:metrics]
@metrics[:users][:year][:male]

甚至:

Metrics.find(params[:id])[:metrics][:users][:year][:male]

另外,为什么不离开metrics字段,然后将Metrics类的实例视为Hash的实例?使用Mongoid,您可以使用标准的Ruby Hash符号语法动态设置和获取属性,而无需“声明”字段。删除了metrics字段:

m = Metric.new
m[:users] = {}
m[:users][:year] = {}
m[:users][:year][:male] = "data"

此外,如果您需要自动初始化嵌套哈希的方法,那么您可以执行以下操作:

m = Metric.new
m[:users][:year][:male] = "data"

您可以将所有逻辑放入Metrics类。要开始使用,您可以尝试使用AutoHash类here中的[][]=方法进行调整。这会给你我认为最干净的界面。