代码之家  ›  专栏  ›  技术社区  ›  M. Ryan

Rails对象关系和JSON呈现

  •  42
  • M. Ryan  · 技术社区  · 15 年前

    免责声明,我对Rails知之甚少。我尽量简明扼要。 考虑到Rails中的以下模型关系:

    class ModelA < ActiveRecord::Base
      belongs_to :ModelB
    
    ...
    
    class ModelB < ActiveRecord::Base
        has_many :ModelA
    

    当调用modela控制器的show操作时,返回的json应该显示对象b的所有子对象,其中所讨论的对象a是其子对象。

    所以,如果我有一个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 回复  |  直到 9 年前
        1
  •  106
  •   George Stocker NotMe    9 年前

    默认情况下,您将只获得表示 modelb 在上面的示例中。但是,您也可以告诉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...])
    
        2
  •  0
  •   Châu Hồng LÄ©nh    10 年前

    如果想要更灵活的方法来呈现JSON,可以考虑使用gem jbuilder: https://github.com/rails/jbuilder

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