一次将多个记录插入模型
我正在寻找一些最佳实践,当涉及到将数据插入到模型中时,尤其是当要创建大量记录时,到目前为止,我正在检索一些XML并将其保存到模型中
doc = Nokogiri::XML.parse(open(url)) doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]').each do |s| cid = s.xpath("xmlns:id").text email = s.xpath("gd:email/@address").text name = s.xpath("xmlns:title").text data = Contact.new( :cid => cid, :email => email, :name => name) data.save end
现在这是逐个插入记录,这在我看来花了太长时间。
我已经读过一个解决方案是使用事务,或者我可以进行单个质量插入? 我的问题是,我将从哪一方面受益最多,以及如何格式化我已经拥有的每一项? 看到我当前设置到新设置的示例将使我受益,因为我将能够更多地理解它并实际从中学习
任何帮助赞赏
谢谢
其他人已经解决了这个问题,解决方法是使用activerecord-import。 看原始问题 ……
有关使用activerecord-import的详细信息,请参阅 wiki
编辑:如果您不突出显示文本,显然链接按钮不会将链接复制为标题。
doc = Nokogiri::XML.parse(open(url)) data = [] doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]').each do |s| cid = s.xpath("xmlns:id").text email = s.xpath("gd:email/@address").text name = s.xpath("xmlns:title").text data << Contact.new( :cid => cid, :email => email, :name => name) end Contact.import data
您也可以尝试upsert
,这将允许您快速插入记录(在某些测试中,比activerecord-import
更快),而无需先在内存中累积它们:
require 'upsert' # [...] doc = Nokogiri::XML.parse(open(url)) Upsert.batch(Contact.connection, Contact.table_name) do |upsert| doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]').each do |s| cid = s.xpath("xmlns:id").text email = s.xpath("gd:email/@address").text name = s.xpath("xmlns:title").text upsert.row( :cid => cid, :email => email, :name => name ) end end
这适用于MySQL,Postgres和SQLite3。