strong rails permit multiple ruby-on-rails xml activerecord filter associations

ruby on rails - permit - Filtrado de asociaciones profundas en Rails ''to_xml



strong parameters nested attributes (1)

Tengo un objeto Person que tiene_muchos roles. Los roles, a su vez, pertenecen a la aplicación. Estoy usando la siguiente pieza de código para representar esta profunda relación en XML:

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

Representando 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 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, el siguiente resultado si solo buscaba 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.


Quizás una forma de hacerlo sería anular su función al método to_xml. Se vería como el siguiente (de forma aproximada):

en su modelo de rol:

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

fin

y lo llamarías así:

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

(mira la documentación al final de esta página )