我正在尝试使用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)
如何实现以上加载以上网址给我的内容如下:
<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
也许我真的太盲目了,但我被困了...... 任何想法都受到热烈欢迎。
由于
马特
答案 0 :(得分:2)
终于自己解决了。 不知道将include包含在render 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 :(得分:1)
finder的:include
选项指定它应该急切地从数据库中获取相关项。 :include
的{{1}}选项指定它应包含在XML呈现中。
如果规范的XML表示包含相关对象,您可以覆盖to_xml
方法以使您的生活更简单:
to_xml
然后由于class Airport
def to_xml(options={})
super(options.merge(:include => :runways))
end
end
会调用render
,如果不这样做,您的控制器代码可以只是
to_xml