2011-12-27 11 views
2

私は、Rails 3.1でこの単純なことを無駄なく達成しようと何時間も諦めました。レコードのハッシュ表現のネストされた属性

@model = TopLevelModel.find(1, :include => {:middle_level_children => :bottom_level_children}) 

TopLevelModel: 
    MiddleLevelModel: 
    BottomLevelModel 

私は熱心にそのように私のクエリでの階層全体をロードしています:私は次のように、いくつかのモデルが深いとbelongs_toの/外部キーで多対1に関連する2つのレベルを入れ子になったんです

JSONシリアライザは、ネストされた階層を(:includeオプションを使用して)シリアライズするのに問題ありませんが、これは私の目的では十分ではなく、レコード属性の(ルビー)ハッシュ表現が必要です。 @model.attributes()は完璧ですが、それは私の関係を無視しています。このメソッドを使用してネストされたハッシュ表現を取得する方法はありますか(私はドキュメントを徹底的に読んでいないと思いますが、おそらく私が知らないいくつかのエキゾチックなオプションがあります)。明確にするために、私が探しています表現は次のようになります。

{ 
    :attribute_1 => 'some attribute', #an attribute of top level model 
    #... 
    :middle_level_children: => [{ # type 'MiddleLevelModel' 
    :attr_1 => 'some attribute of middle level model', 
    # ... 
    :bottom_level_children => [{ #type 'BottomLevelModel' 
     :attr => 'some attribute of bottom level model' 
    }] 
    }] 
} 

これは非常に簡単(と、私は思うだろう、一般的な)のように思える必要がありますが、私は運がなかったしました。

答えて

0

あなたはすべての子関係を反復して、それぞれのインスタンスに対してすべてattributesを印刷できないのはなぜですか?

+0

これは私の一時的な解決策になるだろうが、私はこれにはおそらくいくつか正しい、自動/反射の教員がいると思った。 –

0

少しホッケーかもしれないが、Hash.from_xmlにうずまきを与える。

オブジェクトのto_xmlメソッドを使用して、関連付けを使用してシリアル化し、次にHash.from_xmlクラスメソッドを使用して逆シリアル化します。

xml = @model_instance.to_xml(:include=>:middle_level_children) 
nested_hash = Hash.from_xml(xml) 
関連する問題