2

以下を使用してメトリクス ハッシュを作成しています。

@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 にデータを保存する方法はありますか?

4

1 に答える 1

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そのすべてのロジックをクラスに入れることができます。これを開始するには、ここで説明されている AutoHash クラスのメソッド[]やメソッドなどを適応させてみてください。それは私が思う最もクリーンなインターフェースを提供します。[]=

于 2012-08-22T03:23:45.063 に答える