wake-up-neo.com

Rails-Objektbeziehungen und JSON-Rendering

Haftungsausschluss, ich weiß sehr wenig über Rails. Ich versuche es kurz zu fassen ... In Anbetracht der folgenden Modellbeziehungen in Rails:

class ModelA < ActiveRecord::Base
  belongs_to :ModelB

...

class ModelB < ActiveRecord::Base
    has_many :ModelA

Beim Aufruf der show-Aktion des ModelA-Controllers sollte die zurückgegebene JSON alle ObjectAs anzeigen, die untergeordnete Objekte der ObjectB sind, von denen die betreffende ObjectA untergeordnet ist.

Wenn ich also eine ObjectB habe, die ObjectAs mit ID 1, 2 und 3 enthält, dann auf /modela/1.json zugreifen

Ich sollte sehen:

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

Standardmäßig erhalten Sie nur die JSON, die in Ihrem obigen Beispiel modelb darstellt. Sie können Rails jedoch auch anweisen, die anderen verwandten Objekte einzubeziehen:

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

Sie können sogar bestimmte Felder ausschließen, wenn Sie sie nicht im Export sehen möchten:

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

Oder schließen Sie nur bestimmte Felder ein:

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

Und Sie können diese so tief verschachteln, wie Sie möchten (sagen wir, dass ModelB auch viele ModelC hat):

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

Wenn Sie mehrere untergeordnete Modellzuordnungen einschließen möchten, haben Sie folgende Möglichkeiten:

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

Wenn Sie einen flexibleren Ansatz für das Rendern von Json wünschen, können Sie den Gem Jbuilder verwenden: https://github.com/Rails/jbuilder

Es ermöglicht Ihnen, benutzerdefinierte Attribute, Instanzvariablen, Zuordnungen anzuzeigen und Json-Partials auf bequeme Weise wiederzuverwenden.

0