2011-08-04 17 views
5

Tengo una persona objeto de que has_many papeles. Los roles, a su vez, pertenecen a la aplicación. Estoy usando el siguiente fragmento de código para hacer que esta relación profunda en XML:Filtrado profundas asociaciones en to_xml Rails

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

representación a cabo algo como esto:

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

Esto funciona, sin embargo, me gustaría filtrar qué aplicaciones y roles que muestra. Me gustaría mostrar solo roles (y por lo tanto, anidados dentro de ellos, aplicaciones) donde application_id es un cierto entero. Por ejemplo, la siguiente salida si yo estaba buscando solamente == 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> 

Gracias de antemano por cualquier ayuda que pueda ofrecer.

+0

¿Qué solución acabaste la implementación? ¿Mi respuesta te ayudó? – alex

+0

Sí, fue útil pero terminé usando el motor de plantillas XML Builder. – Christopher

Respuesta

1

Tal vez una forma de hacerlo sería para anular su método de papel to_xml. Se vería como la siguiente (aproximativamente):

en su Modelo a seguir:

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 

final

y que lo llamaría así:

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

(ver el documentación al final de esta page)

Cuestiones relacionadas