Question

Je suis en train d'obtenir ma tête autour des associations imbriquées dans Rails en utilisant ActiveResource. Mon exemple est le suivant: Ce que j'est un aéroport avec de nombreuses pistes.

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): Y at-il un moyen de stocker les données du client 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

Était-ce utile?

La solution

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

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

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

et appellera depuis <=> si vous ne <=> pas, votre code de contrôleur peut être simplement

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

Autres conseils

Résolue moi-même enfin. Était pas au courant de mettre l'inclure dans le statememt rendu:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top