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]
}
}
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...])
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.