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

今、これは私の意見では時間がかかりすぎるレコードを1つずつ挿入しています。

解決策の 1 つはトランザクションを使用することであると読みましたが、それとも単一の一括挿入を行うことができますか? 私の質問は、どれから最も恩恵を受けるか、そしてこれらのそれぞれに対して既に持っているものをどのように再フォーマットするかということです? 現在のセットアップの例を新しいセットアップで見ることは、それをより理解し、実際にそこから学ぶことができるので、私にとって有益です。

どんな助けでも大歓迎

ありがとう

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 に答える