我正在使用以下方法创建度量散列:

@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中存储数据方面,有没有一种方法可以保持一致?

最佳答案

你用的是什么版本的ruby和mongoid?在Mongoid3.0.4和Ruby1.9.3中,通过符号访问Mongoid对象中的散列很好所以我可以这样做:

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

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

另外,为什么不把metrics字段去掉,然后将Metrics类的实例视为Hash类的实例呢使用Mongoid,您可以使用标准的Ruby哈希符号语法动态地设置和获取属性,而无需“声明”字段。删除metrics字段后:
m = Metric.new
m[:users] = {}
m[:users][:year] = {}
m[:users][:year][:male] = "data"

此外,如果需要方法来自动初始化嵌套散列,则可以执行以下操作:
m = Metric.new
m[:users][:year][:male] = "data"

您可以将所有这些逻辑放入Metrics类中。首先,您可以尝试修改autohash类中的[][]=方法。这会给你我认为最干净的界面。

关于ruby - 在Mongoid文档中保存和获取哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12064583/

10-13 04:53