2011-08-04 28 views
5

Tôi có đối tượng Person có vai trò has_many. Vai trò, lần lượt, thuộc về ứng dụng. Tôi đang sử dụng đoạn mã sau đây để làm cho mối quan hệ sâu này vào XML:Lọc các liên kết sâu trong Rails 'to_xml

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

Rendering ra một cái gì đó như thế này:

<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> 

này hoạt động, tuy nhiên, tôi muốn lọc các ứng dụng và vai trò của nó hiển thị. Tôi muốn chỉ hiển thị các vai trò (và do đó, lồng nhau trong chúng, các ứng dụng) trong đó application_id là một số nguyên nhất định. Ví dụ: đầu ra sau nếu tôi chỉ đang tìm kiếm 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> 

Cảm ơn bạn đã giúp đỡ.

+0

Bạn đã thực hiện giải pháp nào? Câu trả lời của tôi có giúp bạn không? – alex

+0

Có, nó rất hữu ích nhưng tôi đã kết thúc bằng cách sử dụng công cụ tạo khuôn mẫu XML Builder. – Christopher

Trả lời

1

Có thể một cách để thực hiện việc đó là ghi đè phương thức to_xml vai trò của bạn. Nó sẽ trông giống như sau (approximatively):

trong mô hình Vai trò của bạn:

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 

cuối

và bạn sẽ gọi nó là như thế này:

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

(nhìn vào tài liệu ở cuối số page)

Các vấn đề liên quan