Ruby libxml解析并插入数据库

时间:2010-07-20 10:51:41

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

我目前正在尝试从一个记录PBS上作业的xml文件中读取。我已成功设法解析代码,但无法将objtects插入我的数据库,我收到此错误:

“当你没想到它时,你有一个零对象! 您可能期望ActiveRecord :: Base的实例。 在评估nil.delete“

时发生错误

这是我的模特:

require 'xml/libxml'

class Job < ActiveRecord::Base

  JOB_DIR = File.join('data', 'jobs')

  attr_reader :jobid, :user, :group, :jobname, :queue, :ctime
  attr_reader :qtime, :etime, :start, :owner

  def initialize(jobid, user, group, jobname, queue, ctime, qtime, etime, start, owner)
    @jobid, @user, @group, @jobname, @queue = jobid, user, group, jobname, queue
    @ctime, @qtime, @etime, @start, @owner = ctime, qtime, etime, start, owner
  end

  def self.find_all()
    jobs = []
    input_file = "#{JOB_DIR}/1.xml"
    doc = XML::Document.file(input_file) 
    doc.find('//execution_record').each do |node| 
      jobs << Job.new(
        node.find('jobid').to_a.first.content,
        node.find('user').to_a.first.content,
        node.find('group').to_a.first.content,
        node.find('jobname').to_a.first.content,
        node.find('queue').to_a.first.content,
        node.find('ctime').to_a.first.content,
        node.find('qtime').to_a.first.content,
        node.find('etime').to_a.first.content,
        node.find('start').to_a.first.content,
        node.find('owner').to_a.first.content

      )
    end
    jobs
  end
end

我的模型控制器:

class JobController < ApplicationController

  def index
    @jobs = Job.find_all()
  end

  def create
    @jobs = Job.find_all()
    for job in @jobs
      job.save
    end
  end

end

感谢您的帮助......谢谢!

1 个答案:

答案 0 :(得分:1)

我不确定您看到的错误消息的原因,因为我无法看到您尝试调用delete方法的任何地方,但这似乎有点混淆使用ActiveRecord。

如果您的jobs数据库表包含字段jobidusergroupjobname等,那么ActiveRecord将为这些和您不应该使用attr_reader或覆盖initialize。您也不应该设置值值实例变量(@jobid等)。如果在您的表上有这样的字段,那么当前代码中没有任何内容可以映射来自XML数据库字段。

您的def self.find_all方法可能应该遵循:

def self.build_from_xml
  jobs = []
  input_file = "#{JOB_DIR}/1.xml"
  doc = XML::Document.file(input_file) 
  doc.find('//execution_record').each do |node| 
    jobs << Job.new(
      :jobid => node.find('jobid').to_a.first.content,
      :user => node.find('user').to_a.first.content,
  ...

Rails曾经拥有自己的find_all方法来从数据库中检索所有现有记录,因此您的方法名称可能有点误导。 Rails倾向于使用 build 动词来表示创建一个新的模型对象但是还没有保存它这就是为什么我的名字就像{{1} }。