Фильтрация глубоких ассоциаций в Rails 'to_xml - PullRequest
5 голосов
/ 05 августа 2011

У меня есть объект Person с ролями has_many. Роли, в свою очередь, принадлежат приложению. Я использую следующий фрагмент кода для рендеринга этих глубоких отношений в 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>

Заранее благодарим за любую помощь, которую вы можете предложить.

1 Ответ

1 голос
/ 05 августа 2011

Возможно, один из способов сделать это - переопределить вашу роль для метода to_xml. Это будет выглядеть примерно так (приблизительно):

в вашей ролевой модели:

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 => {} } )

(см. Документацию в конце этой страницы )

...