1

我正在寻找一些最佳实践,当涉及到插入数据到模型中,尤其是当有很多记录被创建时,到目前为止我正在检索一些XML并保存它into a model一次插入多个记录到模型

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

是的,但是这不应该被关闭,因为@JeffPaquette提供了一个有问题代码的工作示例,它与GEM提供的默认示例不同 – Richlewis 2013-04-04 14:16:33

+0

您应该能够自己弄清楚。我认为它应该被关闭。这对你的特定情况有效,对于有同样问题的其他用户不会有任何额外的好处。对他们来说,最初的问题是很清楚的。 – Mischa 2013-04-04 14:19:49

+1

我不确定,因此我问......的原因,你怎么能说它不会受益于任何其他用户,什么是容易的,并不一定容易为别人 – Richlewis 2013-04-04 14:22:03

回答

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 
+0

谢谢,仍然不确定如何与我的实施设置虽然,也提供链接是坏了(我没有-1你)你能提供一个例子吗? – Richlewis 2013-04-04 13:52:53

+0

好吧,所以这个例子是使用10.times做的,我不知道有多少记录将被检索,所以它的n次的情况下...我将如何设置? – Richlewis 2013-04-04 14:02:24

+0

查看更新的答案 – 2013-04-04 14:08:19

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。

+0

谢谢,生病了试试这个, – Richlewis 2013-04-04 17:44:37