Rails对象关系和JSON渲染

时间:2010-08-11 20:54:29

标签: ruby-on-rails ruby json activerecord

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

class ModelA < ActiveRecord::Base
  belongs_to :ModelB

...

class ModelB < ActiveRecord::Base
    has_many :ModelA

当调用ModelA控制器的show动作时,返回的JSON应该显示所有ObjectAs,它们是ObjectB的子节点,其中ObjectA是其子节点。

因此,如果我有一个ObjectB,其中包含ID为1,2和3的ObjectA,然后访问:/modela/1.json

我应该看到:

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

2 个答案:

答案 0 :(得分:106)

默认情况下,您只会在上面的示例中获得代表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也有很多ModelC):

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

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

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

答案 1 :(得分:1)

如果你想要一种更灵活的方法来渲染json,你可以考虑使用gem jbuilder:https://github.com/rails/jbuilder

它允许您以方便的方式呈现自定义属性,实例变量,关联,重用json部分。