0

次の方法でUserオブジェクトをjsonに変換しています。

user.to_json :methods => :new_cookies

new_cookiesメソッドは次のとおりです。

cookies.all :include => :fortune, :conditions => {:opened => false}

これにより、ユーザーのjsonオブジェクト内にCookieが埋め込まれますが、幸運もCookieオブジェクト内に埋め込まれるようにしたいと思います。私は中を通り過ぎまし:include => :fortuneたが、それはうまくいきません。

これは可能ですか?

モデル:

class User < ActiveRecord::Base
    has_many :cookies
    has_many :fortunes, :through => :cookies

    def new_cookies
        cookies.all :include => :fortune, :conditions => {:opened => false}
    end
end

class Cookie < ActiveRecord::Base
    belongs_to :user
    belongs_to :fortune
end

class Fortune < ActiveRecord::Base
    serialize :rstatuses
    serialize :genders 

    has_many :cookies
    has_many :users, :through => :cookies
end
4

1 に答える 1

0

この:includes => :fortuneオプションが期待どおりに(またはおそらくまったく)機能するかどうかはわかりません。現在のRailsガイドのこのセクションの終わり近くに、以外のファインダーメソッドのこのオプションが記載されています.all

新しいActiveRelationクエリインターフェイスと同様に機能すると思います。たとえばCookies.include(:fortunes).where(:opened => false)、この場合、Railsは関連するレコードを「熱心にロード」します。つまり、Cookieのクエリの一部として運命が取得されます。これはパフォーマンスの向上ですが、それ以外の場合はRailsの動作を変更しません。

コメントで述べたように、私はas_jsonあなたが望むことをするだろうと思います-それはを使用してシリアル化されたときにオブジェクトの一部であるかどうかを定義しますto_json。データバックアップオブジェクト自体のメソッドに加えて(または除外するために)呼び出す必要のあるメソッド(メソッドなど)を指定しますnew_cookies

この例では、(Cookieを取得する)に追加as_jsonしました。また、各CookieがJSONにその運命をネストすることを期待してに追加しました。別の方法については、以下を参照してください。UserCookie

class User < ActiveRecord::Base
  has_many :cookies
  has_many :fortunes, :through => :cookies

  def as_json(option = {})
    super(:methods => :new_cookies)
  end

  def new_cookies
    cookies.all :conditions => {:opened => false}
  end
end

class Cookie < ActiveRecord::Base
  belongs_to :user
  belongs_to :fortune

  def as_json(options = {})
    super(:methods => :cookie_fortune)  # or perhaps just :fortune 
  end

  def cookie_fortune
    self.fortune
  end
end

APIを作成していて、オブジェクト間のネストされた関係をJSONに反映する必要がない場合、コントローラーでは、次のようなものを使用しました。

respond_to do |format|
  format.html 
  format.json { render json: { :foo => @foo, :bar => @bar }}
end

JSONで並列ノード(オブジェクト)を生成します。

于 2012-11-28T14:48:53.413 に答える