1

在我的 Rails 应用程序中,我必须导入大型 XML 文件,这将同时影响 10 个或更多模型。

现在我不确定这个导入的代码属于哪里。我是否应该将其包含在一个模型中,将其拆分到所有受影响的模型中,使用模块,甚至关注点?

有没有人有这方面的经验,可以给我一些建议?

4

3 回答 3

3

如果导入从一个 XML 文件一次发生,那么只需编写一个导入脚本并将其放入,/lib/imports然后从 rake 任务或其他东西中调用它。除非您需要将其分解为类方法,否则我个人认为没有意义。

我们每天通过几个不同的导入脚本导入大约 600MB 的 XML,它们都在/lib/importsrake 任务中并被调用,这些任务又使用 cron 调度和运行。

于 2013-03-11T10:21:34.627 回答
3

我会使用 app/models/tasks/somename_importer.rb 并在那里封装所有进口商的东西。您还可以为要导入的实际数据对象创建模型。

class ImportedObject
  attr_accessor :have, :some, :accessor, :to, :hold, :data
  def initialize(data, *opts)
    # move data to instance variables
  end

  def to_object
    Object.new(some: mapping)
  end
end

class Tasks::SomeNameImporter
  def initialize
    # maybe setup some logging and stuff
  end

  def perform
    # fetch data from some source via http or file or ftp and iterate over appropriate items
    data.each do |item|
      imported = ObjectToImport.new(item)

      # you can do whatever you want with your imported data
      object   = imported.to_object
      if object.valid?        
        object.save
      else
        # do some logging 
      end
    end    
  end
end
于 2013-03-11T14:53:26.803 回答
1

假设您可能还需要一些方法来与 xml 交互,我会这样做

class XmlBase < ActiveRecord::Base
  #import xml files

  def method_to_parse_xml
      #code
  end
end

在您的模型中(需要 xml 文件)

class User < XmlBase

end

class Project < XmlBase

end

#normal models
class Company < ActiveRecord::Base

end
于 2013-03-11T10:05:41.583 回答