2011-08-04 8 views
5

में गहरे संबंधों को फ़िल्टर करना मेरे पास एक व्यक्ति वस्तु है जिसमें कई भूमिकाएं हैं। बदले में भूमिकाएं, आवेदन के लिए संबंधित हैं। कुछ इस तरह बाहर प्रतिपादनरेल 'to_xml

format.xml { render :text => @person.to_xml(:include => { :roles => { :include => :application } }) } 

:: मैं एक्सएमएल में इस गहरे संबंध रेंडर करने के लिए कोड का निम्न भाग का उपयोग कर रहा

<person> 
    <email>****@****.edu</email> 
    <first>Christopher</first> 
    <last>****</last> 
    <loginid>****</loginid> 
    <roles type="array"> 
    <role> 
     <application-id type="integer">3</application-id> 
     <name>Access</name> 
     <application> 
     <name>****</name> 
     </application> 
    </role> 
    <role> 
     <application-id type="integer">2</application-id> 
     <name>Create Ballots</name> 
     <application> 
     <name>****</name> 
     </application> 
    </role> 
    </roles> 
</person> 

यह काम करता है, फिर भी, मैं फिल्टर करने के लिए जो आवेदन पत्र चाहते हैं और भूमिकाएं दिखाती हैं। मैं केवल भूमिकाएं दिखाना चाहता हूं (और इस प्रकार, उनके भीतर घोंसला, अनुप्रयोग) जहां application_id एक निश्चित पूर्णांक है। उदाहरण के लिए, यदि मैं केवल application_id == 3:

<person> 
    <email>****@****.edu</email> 
    <first>Christopher</first> 
    <last>****</last> 
    <loginid>****</loginid> 
    <roles type="array"> 
    <role> 
     <application-id type="integer">3</application-id> 
     <name>Access</name> 
     <application> 
     <name>****</name> 
     </application> 
    </role> 
    </roles> 
</person> 

किसी भी सहायता के लिए अग्रिम धन्यवाद।

+0

आपने किस समाधान को कार्यान्वित किया? क्या मेरा जवाब आपकी मदद करता है? – alex

+0

हां, यह सहायक था लेकिन मैं एक्सएमएल बिल्डर टेम्पलेटिंग इंजन का उपयोग कर समाप्त हुआ। – Christopher

उत्तर

1

शायद ऐसा करने का एक तरीका आपकी भूमिका को_xml विधि को ओवरराइड करना होगा।

आपका रोल मॉडल में

:: यह निम्नलिखित (approximatively) कैसा दिखेगा

def to_xml(options={}) 
    if application.id != 3 
     options[:indent] ||= 2 
     xml = options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent]) 
     xml.instruct! unless options[:skip_instruct] 
     xml.role do 
     # role_application is the application linked to you role.. 
     role_application = applications.select {|a| a.id == 3} 
     xml.application_id role_applications.id 
     xml.name role_application.name 
     xml.application do 
      xml.name role_application.name 
     end 
     end 
    else 
    # return nothing 
    return "" 
    end 
end 

अंत

और आप इसे इस तरह से कहेंगे:

format.xml { render :text => @person.to_xml(:include => { :roles => {} }) 

(देखो इस page के अंत में प्रलेखन)