web-dev-qa-db-ja.com

Railsオブジェクトの関係とJSONレンダリング

免責事項、私はRailsについてほとんど知りません。私は簡潔になるよう努めます。 Railsで次のモデル関係があるとします。

class ModelA < ActiveRecord::Base
  belongs_to :ModelB

...

class ModelB < ActiveRecord::Base
    has_many :ModelA

ModelAコントローラーのshowアクションを呼び出すと、返されるJSONは、問題のObjectAが子であるObjectBの子であるすべてのObjectAを表示する必要があります。

したがって、ID 1、2、3のObjectAを含むObjectBがある場合、次のようにアクセスします。/modela/1.json

私は見るべきです:

{
  "modelb": {
    "id": "1",
    "modela": [insert the ModelA JSON for ID's 1, 2 and 3]
  }
}
45
M. Ryan

デフォルトでは、上記の例ではmodelbを表すJSONのみが取得されます。しかし、Railsに他の関連オブジェクトも含めるように指示できます。

def export
  @export_data = ModelA.find(params[:id])
  respond_to do |format|
    format.html
    format.json { render :json => @export_data.to_json(:include => :modelb) }
  end
end

エクスポートでそれらを表示したくない場合は、特定のフィールドを除外するように指示することもできます。

render :json => @export_data.to_json(:include => { :modelb => { :except => [:created_at, updated_at]}})

または、特定のフィールドのみを含めます。

render :json => @export_data.to_json(:include => { :modelb => { :only => :name }})

そして、それらを必要なだけ深くネストすることができます(ModelBにもhas_many ModelCがあるとしましょう):

render :json => @export_data.to_json(:include => { :modelb => { :include => :modelc }})

複数の子モデルの関連付けを含める場合は、以下を実行できます。

render :json => @export_data.to_json(include: [:modelA, :modelB, :modelN...])
113
Rob Cameron

Jsonをレンダリングするためのより柔軟なアプローチが必要な場合は、gem jbuilderの使用を検討できます。 https://github.com/Rails/jbuilder

カスタム属性、インスタンス変数、関連付けをレンダリングし、jsonパーシャルを便利な方法で再利用できます。

2