2016-11-06 4 views
0

Also in meiner Rails App gibt es Listen. Jede Liste hat ein Element. Jeder Artikel hat viele Artikel. So kann ein Item zu einem anderen Item gehören. Ich möchte diese Ressourcen als JSON darstellen, wo die untergeordneten Elemente jedes Elements darunter verschachtelt sind. Da jedes Element möglicherweise eigene untergeordnete Elemente haben kann, kann ich nicht einfach die Option include: verwenden, da ich nicht wissen würde, wann das letzte Element keine untergeordneten Elemente hat.Wie verschachtelte Ressourcen als JSON in Schienen rendern, wenn für jede verschachtelte Ressource auch Ressourcen verschachtelt sein könnten?

Es scheint also so, als müsste ich beim Rendern des JSON irgendwie Rekursion verwenden. Wenn also ein Element untergeordnete Elemente hat, sind darunter untergeordnete Elemente, und wenn eines dieser untergeordneten Elemente untergeordnete Elemente enthält, werden die untergeordneten Objekte darunter verschachtelt.

Ich bin mir nicht sicher, wie dies mit to_json und die Include-Option zu tun. Wenn ich gerade war das erste Kind Element der Liste zu machen würde ich dies nur tun:

respond_to do |format| 
    format.json { render json: @list.to_json(include: :item) } 
    end 

Aber ich habe keine Ahnung, wie rekursiv die Artikel Kinder der machen: Einheit und ihre Kinder, und so weiter.

Eine andere Antwort schlägt vor, ein View-Objekt oder ein Juwel wie RABL für ein anderes Problem zu verwenden, das auch für to_json zu komplex erscheint. Ist das, was ich versuche, zu kompliziert für die to_json Methode? Was ist meine beste Option, um untergeordnete Ressourcen als json rekursiv darzustellen?

Danke für die Hilfe.

Antwort

0

Wenn Sie benutzerdefinierte Verfahren zur Herstellung von json verwenden können, das ist, wie Sie das tun können:

class List 
    has_one :item 

    def custom_json 
    json = to_json 
    json[:item] = item.custom_json 
    json 
    end 
end 

class Item 
    has_many :items # add other options 

    def custom_json 
    json = to_json.merge(children: []) 
    items.each { |item| json[:children] << item.custom_json } 
    json 
    end 
end 

Hinweis: hier items die Beziehung beziehen Sie sich für die untergeordneten Elemente in Item Klasse.

Und in Ihrem Controller, könnten Sie

tun
format.json { render json: @list.custom_json } 

Diese in json Struktur führen würde:

{ list_attr: value, list_attr_2: value, item: { item_attr: value, children: [{ child_item_attr: value, ... }] } } 

Lassen Sie mich wissen, ob es hilft.

+0

Danke Ich habe es herausgefunden. Ich dachte, ich hätte diese Frage gelöscht, aber deine Antwort ist richtig. Ich werde es lassen, falls jemand anders in diesem Bereich verwirrt ist. – srlrs20020

Verwandte Themen