2009-12-22 48 views
1

我有一個控制器,它能夠以最直接的,但低效的方式返回XML的has_many協會:生成XML使用批處理找到ActiveRecord關聯

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

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

這將提取和一次實例化的所有對象。爲了提高內存的使用效率,我想使用ActiveRecord的批量查找。乍一看,這似乎是做到這一點的唯一方法:

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

render :xml => xml 

這肯定是更多的內存效率,但斷然那麼優雅。它複製了Array#to_xml的一些現有功能。

有沒有辦法在沒有手動構建XML的情況下利用find_each的威力?

回答

0

我通常生成XML的方法是使用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

啊,對。我已經忘記了這一點。但我想我的擔心不在哪裏做建築(對此,這絕對是最好的方法),而是根本不管建築。我更喜歡能夠調用'.to_xml'的自包含特性,並且找到一種方法來交換在使用'.find_each'生成集合的XML時使用的'.each'。 – Ian 2009-12-24 17:20:07