1

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

现在这是一一插入记录,我认为这花费了太长时间。

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

任何帮助表示赞赏

谢谢

4

2 回答 2

2

其他人已经解决了这个问题,解决方案是使用 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
于 2013-04-04T13:49:55.590 回答
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。

于 2013-04-04T16:18:22.247 回答