我正在寻找一些最佳实践,当涉及到将数据插入到模型中时,尤其是当要创建大量记录时,到目前为止,我正在检索一些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
现在这是逐个插入记录,这在我看来太长了。
我已经读过一个解决方案是使用事务,或者我可以进行单个质量插入?我的问题是,我将从哪一方面受益最多,以及如何格式化我已经拥有的每一项?看到我当前设置到新设置的示例将使我受益,因为我将能够更多地理解它并实际从中学习
任何帮助表示赞赏
由于
答案 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。