一次将多个记录插入模型

我正在寻找一些最佳实践,当涉及到将数据插入到模型中时,尤其是当要创建大量记录时,到目前为止,我正在检索一些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。