代码之家  ›  专栏  ›  技术社区  ›  jalagrange

Ruby libxml解析并插入数据库

  •  0
  • jalagrange  · 技术社区  · 16 年前

    我目前正试图从一个记录PBS上的作业的XML文件中读取数据。我已经成功地成功地解析了代码,但无法将对象插入到我的数据库中,我收到以下错误:

    “当你没有预料到的时候,你有一个零物体! 您可能需要ActiveRecord::Base的一个实例。 计算nil时出错。删除“

    这是我的模型:

    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 回复  |  直到 16 年前
        1
  •  1
  •   mikej heading_to_tahiti    16 年前

    我不确定您看到错误消息的原因,因为我看不到您试图调用的任何位置 delete 方法,但是这看起来有点混淆了ActiveRecord的用法。

    如果你有 jobs 带字段的数据库表 jobid , user , group , jobname 等等,那么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 从数据库中检索所有现有记录,这样您的方法名可能有点误导。轨道倾向于使用 建造 动词与平均数 创建新模型对象,但尚未保存它 所以我用了一个名字 build_from_xml .