我想渲染一个大的(ish)对象数组作为Ruby on Rails中的plist。该集合目前最多包含200个对象,每个对象本质上都是一个记录(键/值字典)。整体结果格式为plist(Apple使用),但逻辑上与任何XML文档没有多大区别。在ruby/rails中渲染大型XML集合的有效方法是什么?
我碰到的问题是渲染数组花费了大约200秒的时间,这对我来说似乎非常慢。我目前使用这样的代码:
def plistify(collection)
resultarray=Array.new()
collection.each do |entry|
hash= entry.attributes
hash["credits"]= entry.credits
hash["ratingcount"]= entry.ratings.count
hash["entryrating"]= entry.detail_rating
hash["entryratingcount"]= entry.entryratingcount
resultarray << hash
end
{'entries'=>resultarray}.to_plist
end
然后被发送到客户端使用:
format.text {render :text => plistify(@entries)}
,输出结果是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>entries</key>
<array> <-- corresponds to resultarray above
<dict> <-- corresponds to a single entry's attributes above. one of these per entry.
<key>cached_review_id</key>
<integer>190</integer>
<key>cached_tag_list</key>
<string>pub restaurant food waitress</string>
<key>created_at</key>
<date>2009-05-31T13:47:10Z</date>
...about 20 key/values...
等几乎所有开销在ruby'plistify'代码中 - 相比之下,数据库开销很小。
假设开销可能来自创建大量临时ruby对象,我试图用视图替换所有这些,并在视图中使用Builder来创建相同的XML文档 - 它的工作原理实际上是两倍的缓慢!
任何想法如何改善这一点,或以其他方式确定瓶颈?
“to_plist”方法有什么作用? – 2009-08-07 16:40:56
to_plist方法来自plist gem--它会自动将给定散列转换为字符串形式的plist(即q中显示的XML文档格式) – frankodwyer 2009-08-07 16:45:57