【问题标题】:saving and fetching hash in Mongoid Document在 Mongoid 文档中保存和获取哈希
【发布时间】:2012-08-21 23:43:38
【问题描述】:

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

@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 ruby-on-rails-3 hash mongoid


    【解决方案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 哈希符号语法动态设置和获取属性,而无需“声明”字段。删除 metrics 字段后:

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

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

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

    您可以将所有这些逻辑放入Metrics 类中。要开始这方面的工作,您可以尝试改编类似 here 解释的 AutoHash 类中的 [][]= 方法。这会给你我认为最干净的界面。

    【讨论】:

    • 嗯,我在 Mongoid 2.4 上。我将在今天晚些时候尝试升级和使用此解决方案
    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多