2009-08-26 7 views
1

Je travaille sur une méthode accesseur personnalisé comme un exemple ci-dessous:Comment rendre un champ personnalisé avec to_xml?

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 

C'est, j'ai besoin de votre aide pour 2 questions:

  1. Comment puis-je accéder à chaque arbre juste pour une instance de classe Forest. (Comme exemple ci-dessous, l'utilisation totale de l'eau ne doit pas résumer l'arbre d'une autre forêt)

    asiaForest = Forest.find_by_name('asia') 
    asiaForest.total_water_usage 
    
  2. Comment puis-je forcer cette méthode à rendre par la méthode to_xml? par exemple, je pense que le résultat doit être similaire à ceci:

    asiaForest.to_xml 
    <asiaForest> 
        ... 
        <total_water_usage>239000</total_water_usage> 
        ... 
    </asiaForest> 
    

Pouvez-vous me aider à le faire?

+0

La documentation to_xml: http://api.rubyonrails.org/classes/ActiveRecord/XmlSerialization.html – Swanand

Répondre

7

records.to_xml(:methods => :total_water_usage)

+0

+1. Simple et clair. – Swanand

0

Les réponses sont les suivantes:

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 

Explication: la partie 1 de la question reçoit une réponse total_water_usage qui appellera water_usage et somme chaque arbre il.

Partie 2, nous devons remplacer la méthode to_xml pour inclure la clé total_water_usage. Extrait de la méthode to_xml d'origine.

1

Pour mettre en œuvre sur une échelle de modèle global, vous pouvez l'ajouter à votre fichier de modèle.

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 
Questions connexes