2009-05-11 10 views
1

Ich versuche, verschachtelte Assoziationen in Rails mit ActiveResource zu bekommen. Mein Beispiel ist wie folgt: Was ich habe, ist ein Flughafen mit vielen Start-und Landebahnen.Rails verschachtelte Ressourcen

Meine Show Aktion in Flughäfen Controller enthält: @airport = Airport.find (params [: id])

Als ich http://localhost/airports/2.xml ich das Stück XML erhalten nennen:

<airport> 
    <code>DUS</code> 
    <created-at type="datetime">2009-02-12T09:39:22Z</created-at> 
    <id type="integer">2</id> 
    <name>Duesseldorf</name> 
    <updated-at type="datetime">2009-02-12T09:39:22Z</updated-at> 
</airport> 

Jetzt, ich habe die Aktion

@airport = Airport.find(params[:id], :include => :runways) 

Wie kann ich erreichen, dass oben genannte URL oben Laden gibt mir so etwas wie:

<airport> 
    <code>FRA</code> 
    <created-at type="datetime">2009-02-12T09:39:22Z</created-at> 
    <id type="integer">2</id> 
    <name>Frankfurt</name> 
    <updated-at type="datetime">2009-02-12T09:39:22Z</updated-at> 

    <runways> 
    <runway> 
     <id>1</id> 
     <name>bumpy runway</name> 
    </runway> 
    </runways> 

</airport> 

Und obendrein: Wenn ich habe einen Klienten mit

class Airport < ActiveResource::Base 
    .. 
end 

und

class Runway < ActiveResource::Base 
    .. 
end 

Wie kann ich es automatisch wie Assoziationen laden:

a = Airport.find(1) 
puts a.runways.length 
=> 1 

Und (last but not least): Gibt es eine Möglichkeit, Daten aus dem Client zu speichern t wie:

a = Airport.find(1) 
a.runways << Runway.find(1) 
a.save 

Vielleicht bin ich wirklich zu blind, aber ich bin fest ... Jede Idee, ist herzlich willkommen.

Dank

Matt

+0

Haben Sie jemals die a.runways << Runway.find (1) Teil dieser Gleichung herausgefunden? – Sixty4Bit

Antwort

1

Die :include Option für den Finder gibt an, dass es mit Spannung die entsprechenden Elemente aus der Datenbank holen sollte. Die Option :include für to_xml gibt an, dass sie in das XML-Rendering einbezogen werden soll.

Wenn die kanonische XML-Repräsentation der zugehörigen Objekte enthält, können Sie die to_xml Methode überschreiben, Ihr Leben ein wenig einfacher zu machen:

class Airport 
    def to_xml(options={}) 
    super(options.merge(:include => :runways)) 
    end 
end 

und dann seit renderto_xml nennen, wenn Sie dies nicht tun, Ihren Controller Code kann einfach sein

format.xml { render :xml => @airport } 
+0

Danke, macht Sinn! – Matt

2

es mir endlich gelöst. war nicht bewusst, die in den statememt machen gehören zu setzen:

def show 
    @airport = Airport.find(params[:id], :include => :runways) 
    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @airport.to_xml(:include => :runways) } 
    end 
end 
+0

Danke. Dies ist an vielen Stellen nicht dokumentiert. Ich musste lange suchen. – Stefan

Verwandte Themen