导入代码在Rails中的位置是什么?

时间:2013-03-11 09:59:05

标签: ruby-on-rails ruby-on-rails-3 import

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

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

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

3 个答案:

答案 0 :(得分:3)

如果从一个XML文件一次性导入,则只需编写一个导入脚本并将其放入/lib/imports,然后从rake任务或其他任务中调用它。除非你需要将它分解为类方法,否则我个人并不明白这一点。

我们每天通过几个不同的导入脚本导入大约600MB的XML,它们全部在/lib/imports并从rake任务调用,而rake任务又使用cron进行调度和运行。

答案 1 :(得分: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

答案 2 :(得分: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