我想使用Builder来构建一组基于 ActiveRecord 模型表的 XML 文件。我有将近一百万行,所以我需要使用它find_each(batch_size: 5000)
来迭代记录并为每批记录编写一个 XML 文件,直到记录用尽。类似于以下内容:
filecount = 1
count = 0
xml = ""
Person.find_each(batch_size: 5000) do |person|
xml += person.to_xml # pretend .to_xml() exists
count += 1
if count == MAX_PER_FILE
File.open("#{filecount}.xml", 'w') {|f| f.write(xml) }
xml = ""
filecount += 1
count = 0
end
end
这不适用于 Builder 的界面,因为它希望在块中工作,如下所示:
xml = builder.person { |p| p.name("Jim") }
块结束后,Builder 关闭其当前节;您不能保留对 p 的引用并在块之外使用它(我尝试过)。基本上,Builder 想要“拥有”迭代。
因此,要使这项工作与 builder 一起工作,我必须执行以下操作:
filecount = 0
offset = 0
while offset < Person.count do
count = 0
builder = Builder::XmlMarkup.new(indent: 5)
xml = builder.people do |people|
Person.limit(MAX_PER_FILE).offset(offset).each do |person|
people.person { |p| p.name(person.name) }
count += 1
end
end
File.open("#output@file_count.xml", 'w') {|f| f.write(xml) }
filecount += 1
offset += count
end
有没有办法在没有块语法的情况下使用 Builder?有没有办法以编程方式告诉它“关闭当前节”而不是依赖一个块?