Rails вложенные ресурсы - PullRequest
1 голос
/ 11 мая 2009

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

Мое шоу-действие в контроллере аэропортов содержит: @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

И (последнее, но не менее важное): есть ли способ хранения данных от клиента, например:

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

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

Спасибо

Мэтт

Ответы [ 2 ]

2 голосов
/ 11 мая 2009

Наконец-то решил сам. Не был осведомлен о том, чтобы включить include в рендер 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
1 голос
/ 12 мая 2009

Опция :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 }
...