2012-04-26 9 views
10

私はas_jsonメソッドを使用している問題に取り掛かりました。効率的にオブジェクトをJSONに返す方法はです。これはbelongs_toオブジェクトのbelongs_toオブジェクトも独自のbelongs_toオブジェクトを持つJSONオブジェクトです。コードはおそらくそれをよりよく説明するでしょう。Rails as_jsonの問題 - ネストされたオブジェクトを効率的に含めるには?

ないワーキングウェイ

Alertクラス

class Alert < ActiveRecord::Base 
    belongs_to :message 
    # for json rendering 
    def as_json(options={}) 
     super(:include => :message) 
    end 
end 

Messageクラス

def as_json(options={}) 
    super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names], 
      include: { camera: { only: [:id, :name] }, 
         position: { only: [:id, :name, :address, :default_threat_level ]}, 
         images: { only: [:id, :photo_url, :is_hidden]} }) 
    end 

最初の設定これで問題は、私は警告オブジェクトを持っている場合電話:

alert.as_json() 

私はアラートからのすべての属性とのメッセージからすべての属性を取得しますが、ここではカメラ等のような私が欲しいのメッセージから他の属性のどれも、位置、

は「それが動作していない、しかし、おそらくいます適切でないデザインの道」

アラートクラス

class Alert < ActiveRecord::Base 

    belongs_to :message 

    # for json rendering 
    def as_json(options={}) 
     super().merge(:message => message.as_json) 
    end 
end 

メッセージクラス

# for json rendering 
    def as_json(options={}) 
    super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names]) 
      .merge(:camera => camera.as_json) 
      .merge(:position => position.as_json) 
      .merge(:images => images.as_json) 
    end 

この2番目の設定では、私が望むようにすべてのメッセージのネストされた属性を取得します。

私の質問には、これを正しく行うためのRails規約がいくつかありますか?より簡単な方法があるはずです。

答えて

3

使用しているRailsのバージョンはどれですか?これは、古いバージョンのRailsの既知のバグで、恐らくthis pull requestで修正されています。あなたの文法は私にとって正しいと思われるので、おそらくこれがあなたの問題ですか?

また、Jose Valim(Railsコアメンバー)の新しいactive_model_serializersをチェックアウトすることもできます。少なくとも、より洗練された方法で問題を回避することができます。

+0

プルリクエストで修正されたようですが、決してバージョンにプルしませんでした。リンクをありがとう、それはいくつかの問題をクリアしました。 – bluedevil2k

+1

レコードについては、私がそのPRから得たものは以下の通りです:1)json apiのために特定の宝石を使うようにしてください(私はActive Modelシリアライザを好む)2)そうしたくない/できないなら、 'serialized_hash 'の代わりに' as_json'を使用しています。 'as_json'を' serialized_hash'に置き換えてください。あなたのモデルは、含まれている依存関係を正しくレンダリングします。 – kikito

+0

感謝kikito、マイナーな補正、それは 'serializable_hash' – trans1t

1

RABL(Ruby API Builder Languageの略)gem(railscast,)をご覧になることをお勧めします。 HamlやCoffeeScriptのように、JSON(およびXML)レスポンスの構造をテンプレートで定義するためのDSLを提供します。また、パーシャルもサポートしています。

7

私の最善の答えはserializable_hashです。 @kikitoは彼のコメントでこれに触れましたが、動作しないような誤植がありました。それはではなく、serializable_hashです。

as_jsonserializable_hashと置き換えると、このバグは消えます。 (これは今日のRails 4.0.2ではまだ修正されていません)。 XML APIを後で実装するほうが簡単になるというメリットもあります(まだそれらを使用している人もいます)。

+1

ありがとう、私のために働いた – toby

関連する問題