如何使用to_xml呈现自定义字段?

时间:2009-08-26 05:31:20

标签: ruby-on-rails activerecord

我正在开发一个自定义访问器方法,如下例所示:

class Forest < ActiveRecord : Base
  has_many :trees

  def total_water_usage
    # summarize each tree's water_usage in this forest.
    # return as string 
  end

end

class Tree < ActiveRecord : Base
  belongs_to :forest

end

也就是说,我需要你的2个问题的帮助:

  1. 如何仅为Forest类的实例访问每个树。 (如下图所示,总用水量不应总结另一棵森林的树木)

    asiaForest = Forest.find_by_name( 'asia' )
    asiaForest.total_water_usage
    
  2. 如何通过to_xml方法强制使用此方法?例如,我认为结果应该类似于:

    asiaForest.to_xml
    <asiaForest>
       ...
       <total_water_usage>239000</total_water_usage>   
       ...
    </asiaForest>
    
  3. 你能帮我这么做吗?

3 个答案:

答案 0 :(得分:7)

records.to_xml(:methods => :total_water_usage)

答案 1 :(得分:1)

要在全局模型范围内实施,您可以将其添加到模型文件中。

 alias_method :ar_to_xml, :to_xml

  def time_zone_offset
       get_my_time_zone_offset_or_something
  end

  def to_xml(options = {}, &block)
    default_options = { :methods => [ :time_zone_offset ]}
    self.ar_to_xml(options.merge(default_options), &block)
  end

答案 2 :(得分:0)

答案如下:

class Forest < ActiveRecord::Base
  has_many :trees

  def total_water_usage
    trees.sum(:water_usage)
  end

  def to_xml
    attributes["total_water_usage"] = total_water_usage
    attributes.to_xml({:root => self.class.element_name})
  end
end

class Tree < ActiveRecord::Base
  belongs_to :forest

  def water_usage
    # place your water usage calculation for a tree here
  end
end

说明: 问题的第1部分在total_water_usage中得到解答,它将在每棵树中调用water_usage并将其相加。

第2部分我们必须覆盖to_xml方法以包含total_water_usage键。取自原始的to_xml方法。