2009-05-11 4 views
1

Я пытаюсь получить голову вокруг вложенных ассоциаций в Rails с помощью ActiveResource. Мой пример выглядит следующим образом: У меня есть аэропорт со многими взлетно-посадочными полосами.Rails вложенные ресурсы

Моих шоу действий контроллера аэропортов содержит: @airport = Airport.find (Params [: ID])

Когда я называю http://localhost/airports/2.xml я получаю ту часть 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> 

Теперь, Я изменил меры по

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

Как я могу добиться того, что выше загрузка выше URL дает мне что-то вроде:

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

И на вершине, что: Если у меня есть клиент с

class Airport < ActiveResource::Base 
    .. 
end 

и

class Runway < ActiveResource::Base 
    .. 
end 

Как я могу получить его, чтобы автоматически загружать ассоциации, такие как:

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

И (не в последнюю очередь): есть ли способ хранения данных из clien т, как:

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

Может быть, я действительно слишком слеп, но я застрял ... Любая идея, горячо приветствуется.

Благодаря

Matt

+0

Вы когда-нибудь выясняли, какая часть этого уравнения была выровнена. << Runway.find (1)? – Sixty4Bit

ответ

1

:include вариант для искателя указывает, что он должен с готовностью принести соответствующие элементы из базы данных. Опция :include для to_xml указывает, что она должна быть включена в рендеринг XML.

Если каноническое представление XML включает в себя соответствующие объекты, вы можете переопределить метод to_xml, чтобы сделать вашу жизнь немного проще:

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

, а затем, так как render будет называть to_xml, если вы этого не сделаете, ваш контроллер код может просто быть

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

спасибо, имеет смысл! – Matt

2

Решенный это сам наконец. Не знал, чтобы поместить включаемый в рендер statememt:

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

Спасибо. Это не документировано во многих местах. Мне пришлось долго искать. – Stefan