2009-05-11 7 views
1

J'essaie de comprendre les associations imbriquées dans Rails en utilisant ActiveResource. Mon exemple est le suivant: J'ai un aéroport avec plusieurs pistes.Rails ressources imbriquées

Mon action show dans le contrôleur des aéroports contient: @airport = Airport.find (params [: id])

Quand j'appelle http://localhost/airports/2.xml je reçois ce morceau de XML:

<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> 

Maintenant, J'ai changé l'action à

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

Comment puis-je parvenir au-dessus de chargement ci-dessus URL me donne quelque chose comme:

<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> 

Et en plus de cela: Si j'ai un client avec

class Airport < ActiveResource::Base 
    .. 
end 

et

class Runway < ActiveResource::Base 
    .. 
end 

Comment puis-je obtenir pour charger automatiquement des associations comme:

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

Et (last but not least): Existe-t-il un moyen de stocker des données de la clien t comme:

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

Peut-être que je suis vraiment trop aveugle, mais je suis coincé ... Toute idée est chaleureusement la bienvenue.

Merci

Matt

+0

Avez-vous déjà trouvé la solution a.runways << Runway.find (1) de cette équation? – Sixty4Bit

Répondre

1

L'option :include pour le chercheur précise qu'il doit chercher avec impatience les articles connexes de la base de données. L'option :include pour to_xml indique qu'il doit être inclus dans le rendu XML.

Si la représentation XML canonique comprend les objets associés, vous pouvez remplacer la méthode to_xml pour rendre votre vie un peu plus simple:

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

et depuis render appellera to_xml si vous ne le faites pas, votre contrôleur le code peut simplement être

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

merci, cela a du sens! – Matt

2

résolu moi-même enfin. ne savais pas de mettre l'inclure dans le rendu statememt:

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

Merci. Ceci n'est pas documenté dans de nombreux endroits. J'ai dû chercher longtemps. – Stefan

Questions connexes