免责声明,我对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]
}
}
答案 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部分。