Rails对象关系和JSON渲染

M. *_*yan 44 ruby activerecord json ruby-on-rails

免责声明,我对Rails知之甚少.我会尽量简洁.鉴于Rails中的以下模型关系:

class ModelA < ActiveRecord::Base
  belongs_to :ModelB

...

class ModelB < ActiveRecord::Base
    has_many :ModelA
Run Code Online (Sandbox Code Playgroud)

当调用ModelA控制器的show动作时,返回的JSON应该显示所有ObjectAs,它们是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]
  }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ron 111

默认情况下,您只能获得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
Run Code Online (Sandbox Code Playgroud)

如果您不想在导出中看到它们,您甚至可以告诉它排除某些字段:

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

或者,仅包含某些字段:

render :json => @export_data.to_json(:include => { :modelb => { :only => :name }})
Run Code Online (Sandbox Code Playgroud)

你可以根据需要深入嵌套(让我们说ModelB也有很多ModelC):

render :json => @export_data.to_json(:include => { :modelb => { :include => :modelc }})
Run Code Online (Sandbox Code Playgroud)

如果要包含多个子模型关联,可以执行以下操作:

render :json => @export_data.to_json(include: [:modelA, :modelB, :modelN...])
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要多个include,你可以添加一个数组:`@ whatever.to_json(include:[:modelA,:modelB,:modelN ...])`. (4认同)