Pregunta

Estoy tratando de conseguir mi cabeza alrededor asociaciones anidados en rieles con ActiveResource. Mi ejemplo es el siguiente: Lo que tengo es un aeropuerto con muchas pistas de aterrizaje.

Mi programa de acción en el controlador de aeropuertos contiene:     @airport = Airport.find (params [: id])

Cuando llamo http: //localhost/airports/2.xml consigo ese pedazo 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>

Ahora, he cambiado a la acción

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

¿Cómo puedo lograr que por encima de la carga por encima de URL me está dando algo como:

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

Y encima de eso: Si tengo un cliente con

class Airport < ActiveResource::Base
  ..
end

y

class Runway < ActiveResource::Base
  ..
end

¿Cómo puedo conseguir que se cargue automáticamente asociaciones como:

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

Y (último pero no menos importante): ¿Hay una manera de almacenar datos del cliente como:

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

Tal vez estoy realmente demasiado ciego, pero estoy atascado ... Cualquier idea es con gusto agradable.

Gracias

Matt

¿Fue útil?

Solución

El :include opción para el buscador especifica que se debe descargar con impaciencia los artículos relacionados de la base de datos. El to_xml opción para render especifica que debe ser incluido en la prestación XML.

Si la representación XML canónica incluye los objetos relacionados, se puede reemplazar el método <=> para hacer su vida un poco más simple:

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

y luego ya <=> llamarán <=> si no lo hace, su código de controlador puede ser simplemente

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

Otros consejos

resolvió finalmente a mí mismo. No estaba al tanto de poner la incluyen en el statememt render:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top