2

JSONを生成するrespond_with内の :include => :child を短縮する方法を探しています。

これは例です。それが可能かどうかはわかりませんが、調べたいと思います。

コントローラーで:

@p = Parent.where('id = ?', params[:id])
respond_with(@p, :include => {:child1 => {}, :child2 => {}, :child3 => {:include => :grandchild1}})

インスタンスを定義するときにこれらすべてを含める方法はありますか?

たぶん次のようなもの:

@p = Parent.includes(:child1, :child2, :child3, :grandchild1).where('id = ?', params[:id])
respond_with(@p)

基本的に、私は自分のコードを乾かそうとしています...インクルードハッシュを何度も入力し続ける必要はありません...すべての子オブジェクトを1回の呼び出しに含める方法はありますか?

4

1 に答える 1

5

ActiveRecord には、オブジェクトを json として出力する方法を定義する as_json メソッドがあります。このメソッドをオーバーライドして、関連付けられた子をデフォルトで含めることができるので、次のようになります。

class Parent < ActiveRecord::Base

  # We went to display grandchildren by default in the output JSON
  def as_json(options={})
    super(options.merge(:include => {:child1 => {}, :child2 => {}, :child3 => {:include => :grandchild1}})
  end


end

これにより、コントローラーを少しクリーンアップできるはずです。これだけが必要です。

@parent = Parent.find(params[:id])
respond_with @parent
于 2011-08-06T14:04:02.640 に答える