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