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

やっと自分で解決しました。インクルードをrenderstatememtに入れることに気づいていませんでした:

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

ファインダーの: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 に答える