一次将多个记录插入模型

时间:2013-04-04 13:17:19

标签: ruby-on-rails ruby-on-rails-3 activerecord model transactions

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

现在这是逐个插入记录,这在我看来太长了。

我已经读过一个解决方案是使用事务,或者我可以进行单个质量插入?我的问题是,我将从哪一方面受益最多,以及如何格式化我已经拥有的每一项?看到我当前设置到新设置的示例将使我受益,因为我将能够更多地理解它并实际从中学习

任何帮助表示赞赏

由于

2 个答案:

答案 0 :(得分:2)

其他人已经解决了这个问题,解决方法是使用activerecord-import。见original question ...

使用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

答案 1 :(得分:1)

您也可以尝试使用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。