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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top