10

私はas_jsonメソッドを使用している問題に直面しています.JSONでオブジェクトを効率的に返す方法と、belongs_toオブジェクトが独自のbelongs_toオブジェクトを持つJSONとしてのbegs_toオブジェクトですコードはおそらくそれをよりよく説明するでしょう。

うまくいかない方法

アラート クラス

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

メッセージクラス

 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 オブジェクトがあり、

alert.as_json()

Alert からすべての属性を取得し、Message からすべての属性を取得しますが、カメラ、位置など、メッセージから必要な他の属性は取得しません。

これが「機能しているが、おそらく適切な設計方法ではない」です

アラート クラス

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 規則が欠けているのでしょうか? もっと簡単な方法があるはずです。

4

3 に答える 3

3

Rails のどのバージョンを使用していますか? これは古いバージョンの Rails の既知のバグで、このプル リクエストで修正されたと思われます。あなたの構文は私には正しいように見えるので、おそらくこれがあなたの問題ですか?

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

于 2012-04-26T20:11:46.550 に答える
1

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

于 2012-04-26T19:54:38.187 に答える