Carriles recursos anidados
-
21-08-2019 - |
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
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