سؤال

وأنا أحاول الحصول على رأسي حول الجمعيات المتداخلة في القضبان باستخدام ActiveResource. بلدي على سبيل المثال على النحو التالي: ما قلته هو المطار مع العديد من المدارج.

وبلدي عرض عمل في وحدة التحكم المطارات يحتوي على:     airport = Airport.find (بارامس [: معرف])

عند أدعو 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

وربما أنا حقا أعمى جدا، ولكن أنا عالقة ... أي فكرة هو موضع ترحيب بحرارة.

والشكر

ومات

هل كانت مفيدة؟

المحلول

والخيار :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 }

نصائح أخرى

وحلها نفسي في نهاية المطاف. لم يكن على علم لوضع التضمين في تقديم 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top