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 )