【问题标题】:Filtering deep associations in Rails' to_xml在 Rails 的 to_xml 中过滤深层关联
【发布时间】:2011-08-04 22:12:58
【问题描述】:

我有一个拥有多个角色的 Person 对象。反过来,角色也属于应用程序。我正在使用以下代码将这种深层关系呈现为 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>

提前感谢您提供的任何帮助。

【问题讨论】:

  • 您最终实施了什么解决方案?我的回答对你有帮助吗?
  • 是的,这很有帮助,但我最终使用了 XML Builder 模板引擎。

标签: ruby-on-rails xml activerecord filter associations


【解决方案1】:

也许一种方法是覆盖您的角色 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 => {} } )

(查看page末尾的文档)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多