我將我們的應用程序從3.0遷移到3.2.x.之前的流式處理是通過分配response_body一個proc來完成的。像這樣:如何在Rails 3.2中流式傳輸大型XML?
self.response_body = proc do |response, output|
target_obj = StreamingOutputWrapper.new(output)
lib_obj.xml_generator(target_obj)
end
正如你可以想像,在StreamingOutputWrapper響應<<
。
這種方式在Rails 3.2.x中已棄用。建議的方法是分配一個響應each
的對象。
我現在面臨的問題是讓lib_obj.xml_generator
意識到每個問題。
當前版本的它看起來像這樣:
def xml_generator(target, conditions = [])
builder = Builder::XmlMarkup.new(:target => target)
builder.root do
builder.elementA do
Model1.find_each(:conditions => conditions) { |model1| target << model1.xml_chunk_string }
end
end
end
其中target
是StreamingOutputWrapper
對象。
問題是,如何修改代碼 - xml_generator和控制器代碼,以正確地生成響應xml流。
重要的東西:由於模型記錄非常龐大,所以在內存中構建xml不是一個選項。 xml響應的典型大小約爲150MB。
SAX解析你進去看了Saxerat或寶石?它完全規則並使SAX解析變得簡單易行。 –