2009-12-22 2 views
1

je un contrôleur qui retourne XML pour une association has_many la manière la plus évidente mais inefficace possible:XML Génération pour les associations ActiveRecord à l'aide batched trouver

@atoms = @molecule.atoms.find(:all, :include => :neutrons) 

render :xml => @atoms.to_xml(:root => 'atoms') 

Ce va chercher et instancie tous les objets à la fois. Pour rendre cette mémoire plus efficace, j'aimerais utiliser la recherche par lot d'ActiveRecord. À première vue, cela semble être la seule façon de le faire:

xml = '<atoms>' 
@molecule.atoms.find_each(:include => :neutrons) do |atom| 
    xml << atom.to_xml 
end 
xml << '</atoms>' 

render :xml => xml 

Ceci est certainement plus efficace de la mémoire, mais est nettement moins élégante. Il duplique certaines des fonctionnalités existantes de Array#to_xml.

Existe-t-il un moyen d'exploiter la puissance de find_each sans développer XML à la main?

Répondre

0

Mon approche habituelle de la génération de XML consiste à utiliser le modèle XML Builder.

#in the controller 
respond_to do |format| 
    format.html # index.html.erb 
    format.xml # index.xml.builder 
end 

#in index.xml.builder 
xml.atoms { 
    @molecule.atoms.find_each(:include => :neutrons) do |atom| 
    #etc 
    end 
} 
+0

Ah, à droite. J'avais oublié à propos de ça. Mais je suppose que mon souci n'est pas de savoir où faire le bâtiment (pour lequel c'est certainement la meilleure approche) mais de faire le bâtiment du tout. Je préfère la nature autonome de pouvoir appeler '.to_xml' et il serait agréable de trouver un moyen d'échanger le' .each' qui est utilisé lors de la génération du XML d'une collection avec '.find_each'. – Ian

Questions connexes