2010-12-14 9 views
19

私は奇妙なデータモデルの状況から始めます。私がやっていることは次のとおりです。RoRネスト:to_xml/to_jsonにサブリソースを含めることが含まれます

私はBirdというクラスとColorという単純なクラスを持っています。概念的には、各鳥は、色との関連性が2つ、男性色と女性色の2つです。私がこれを処理したのは、鳥や色に属するBirdColorationという結合モデルを使用することです。色が男性か女性かを判断するために追加のブール値フィールドがあります。したがって、各鳥は実際にはBirdColorationとto_manyの関係を持ち、さらにto_manyはColor:BirdColorationを介して関係しています。これが妥当と思われる場合は、読み続ける。それ以外の場合は、停止し、なぜそれが間違っているか教えてください!

私はjsonとして鳥のテーブルをダンプする必要があります。以前は、各鳥が1つの色に対して1つのto_manyの関連付けをしていただけでしたが、include:インクルードしてjsonダンプに各鳥の色を含めることができました。さて、私はダンプにBirdColorationsを含めていますが、まだカラーモデルそのものを取得する必要があります。私は別々に各鳥の色と彩色を入れて解析しながらそれらをマッチさせることができましたが、各彩色の色を直接入れるだけです。何かのように

 format.json { render :json => @birds.to_json(:include => [{:bird_colorations => :color}, :seasons, :habitats, :image_holders]) } 

しかし、上記は機能しません。私はこれが可能でなければならないと思います。どのようにこれを処理するための正しい方向に私を指すことができますか?

今のところ、私は各鳥の色と色を別々に入れて、解析する際にそれらを一致させるだけです。少なくとも私はそれがうまくいくことを知っています。

ありがとうございます!

答えて

51

答えはhereです。 to_xmlとto_jsonの:includeオプションの構文は、ActiveRecordのfindメソッドの構文とは異なります。この方法でネストされたリソースをインクルードするには、配列の代わりにハッシュを渡します。正しいメソッド呼び出しは、次のようになります。

 format.json { render :json => @birds.to_json(:include => {:bird_colorations => {:include => :color}, :seasons => {}, :habitats => {}, :image_holders => {}}) } 

私の質問では、その違いを参照してください。サブリソースを含めたくないリソースについては、シンボル化された名前の値として空のハッシュを渡すだけです。

ライブと学ぶ!

+1

私はこのために多くを投票したいと思います!ありがとう! – brutuscat

+0

私も@brutuscat。私のベーコンを救った! – Rots

+0

あなたの質問のコードははるかにクリーナーに見えますが、これは直感的ではありません。特にbird_colorationsが色を入れ子にしていないと、質問の例がうまくいくためです。ソリューションを投稿していただきありがとうございます。 Railsはこれを修正する必要があります... – thatmiddleway

2

複雑なJSON構造を使用している場合、render :jsonですべてを実行しようとするよりも、serializable_hashまたはas_jsonをモデル内でオーバーライドする方がよいでしょう。

だから、何か

def serializable_hash(options = nil) 
    options ||= {} 
    bird = {:name => name, ...} 
    bird[:seasons] = seasons.serilizable_hash 
    bird[:colors] = ... # whatever complex logic you want to get to the colors 
    bird 
end 

のような両方の機能は、単にハッシュを返す必要があります。

+0

ありがとう!私はこれを見ていきます。私がレンダリングから得ている出力に満足すれば、json、これらのメソッド(パフォーマンス、多分)をオーバーライドする他の理由がありますか?他のすべてのことは同じですが、私の本能は組み込みの機能が私のために世話をすることです。 – CharlieMezak

+0

私はレンダリングJSONはバックグラウンドでas_json/serializable_hashを呼び出しますので、あなたはパフォーマンスの向上を取得するとは思いません。それはちょうどここで最も優雅に議論される "脂肪モデル、薄いコントローラ"と呼ばれる良いデザイン哲学です:http://stackoverflow.com/questions/2550376/rails-skinny-controller-vs-fat-model-or-should-i-メイク・マイ・コントローラー・食欲不振 – icecream

関連する問題