【问题标题】:Populating XML file data to db in Rails在 Rails 中将 XML 文件数据填充到 db
【发布时间】:2010-11-07 09:27:29
【问题描述】:

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

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

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

目前,当我解析数据时,我会生成一个联系人类

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 文件插入到数据库表中?

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

【问题讨论】:

    标签: mysql ruby-on-rails xml parsing hpricot


    【解决方案1】:

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

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

    因此,如果您有一些地址和一些电话的联系方式,那就是这样。

    这就是我的做法:

    解析 XML 文件,如果文件太大,则流式解析。
    为其中的每个联系人输出一个哈希,就像 params[:contact] 通常会在提交表单后在控制器中输出,并让 Contact 模型使用 accepts_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)
    

    【讨论】:

    • 哇,感谢您的快速响应!我错过了accept_nested_attributes_for(我不知道它存在;)我一定会按照您的建议尝试nokogiri。
    • 嗨 Clyfe,我一直在尝试使用您的解决方案,但是,我似乎没有让它工作......尝试创建联系人时:Contact.create(contact),我收到“ActiveRecord::AssociationTypeMismatch Telephone(#73632730) 预期,得到 Hash(#69779430)”。我应该在联系人控制器中使用任何特殊代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多