1

我正在尝试使用 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

并且(最后但并非最不重要):有没有一种方法可以存储来自客户端的数据,例如:

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

也许我真的太盲目了,但我被困住了......任何想法都受到热烈欢迎。

谢谢

马特

4

2 回答 2

2

最后自己解决了。不知道将包含放入渲染状态:

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
于 2009-05-11T11:50:38.153 回答
1

finder的: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 }
于 2009-05-12T15:24:28.790 回答