1

为了处理一些客户端信息,我一直在用 hpricot 解析一个 3MB 的 XML 文件……但是 hpricot 需要相当长的时间来定期解析文件。

我正在考虑将这些数据填充到 MySql 数据库(每周一次),以便我可以直接在带有 Rails 的 mysql 上处理数据。

该文件基本上是一个 XML Google 联系人文件,其中包含客户信息:姓名、电子邮件、注释......但也有一些联系人包含多个值字段,例如地址、电话。

目前,当我解析数据时,我生成了一个 Contact 类

class Contact <
  Struct.new(:name, :email, :telephones, :addresses, :user_address,:notes)
end

telephonesaddresses包含一个具有不同值的数组。

我想如果我想在 mysql 数据库中重新创建这个结构,我需要创建三个表:联系人、电话和地址......

class Contact < ActiveRecord::Base
  has_many :addresses
  has_many :telephones
end

class Telephone < ActiveRecord::Base
  belongs_to :contact
end

class Address < ActiveRecord::Base
  belongs_to :contact
end

您将如何将Contact class数据填充到数据库表中?有没有办法将数据直接从 XML 文件插入到数据库表中?

任何建议和指导将不胜感激:) 谢谢!

4

1 回答 1

1

首先,为什么不试试nokogiri看看它是否更快?

Rails 认为人们是最佳实践,他们开始相信对于任何给定的问题应该如何编程有一个秘诀。不幸的是,情况并非如此,对于通常 90% 的任务来说,没有魔法。

因此,如果您与某些地址和某些电话有联系,那就是这样。

这就是我的做法:

解析 XML 文件,如果它太大,流式解析。
对于其中的每个联系人,都会输出一个哈希,就像params[:contact]提交表单后通常会在控制器中输出的一样,并让Contact模型使用accept_nested_attributes_for

contact = {
  :name => xxx, 
  :user_address => xxx, 
  :notes => xxx
  :addresses_attributes => [
    {:some_attribute => xxx, :some_other_attribute => xxx}
    ...
  ],
  :telephones_attributes => [
    { :some_attribute => xxx, :some_other_attribute => xxx}
    ...
  ]
}

现在剩下的就是:

Contact.create(contact)
于 2010-11-07T10:00:59.200 回答