Trilhos recursos aninhados
-
21-08-2019 - |
Pergunta
Eu estou tentando obter minha cabeça em torno associações aninhadas em Rails usando ActiveResource. Meu exemplo é a seguinte: O que tenho é um aeroporto com muitas pistas.
Meu ação show no controlador aeroportos contém: @airport = Airport.find (params [: id])
Quando eu chamo http: //localhost/airports/2.xml eu começar essa parte da 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>
Agora, eu mudei a ação
@airport = Airport.find(params[:id], :include => :runways)
Como posso conseguir que o carregamento acima acima URL está me 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>
E em cima disso: Se eu tenho um cliente com
class Airport < ActiveResource::Base
..
end
e
class Runway < ActiveResource::Base
..
end
Como posso obtê-lo para carregar automaticamente associações como:
a = Airport.find(1)
puts a.runways.length
=> 1
E (por último, mas não menos importante): Existe uma maneira para armazenar dados a partir do cliente como:
a = Airport.find(1)
a.runways << Runway.find(1)
a.save
Talvez eu estou realmente muito cego, mas eu estou preso ... Qualquer idéia é muito bem vindos.
Graças
Matt
Solução
A opção :include
para especifica localizador que deveria ansiosamente buscar os itens relacionados do banco de dados. A opção :include
para especifica to_xml
que devem ser incluídos na prestação XML.
Se a representação XML canônica inclui os objetos relacionados, você pode substituir o método to_xml
para tornar sua vida um pouco mais simples:
class Airport
def to_xml(options={})
super(options.merge(:include => :runways))
end
end
e, em seguida, uma vez render
chamará to_xml
se você não fizer isso, seu código de controlador pode ser simplesmente
format.xml { render :xml => @airport }
Outras dicas
Resolvido isso sozinho, finalmente. não estava ciente de colocar a incluir no 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