Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Ruby libxml解析和插入到数据库_Mysql_Ruby On Rails_Xml_Parsing_Libxml2 - Fatal编程技术网

Mysql Ruby libxml解析和插入到数据库

Mysql Ruby libxml解析和插入到数据库,mysql,ruby-on-rails,xml,parsing,libxml2,Mysql,Ruby On Rails,Xml,Parsing,Libxml2,我目前正在尝试读取一个xml文件,该文件记录PBS上的作业。我已成功解析代码,但无法将对象插入数据库,我收到以下错误: “当你没有预料到的时候,你有一个零对象! 您可能希望有ActiveRecord::Base的实例。 计算nil时出错。删除“ 这是我的模型: require 'xml/libxml' class Job < ActiveRecord::Base JOB_DIR = File.join('data', 'jobs') attr_reader :jobid, :

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

“当你没有预料到的时候,你有一个零对象! 您可能希望有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
需要“xml/libxml”
类作业jobs我不确定您看到的错误消息的原因,因为我看不到您试图调用
delete
方法的任何地方,但是这看起来确实有点混淆了ActiveRecord的用法

如果您有一个
jobs
数据库表,其中包含字段
jobid
user
group
jobname
等,则ActiveRecord将为这些字段创建访问器方法,您不应使用
attr\u 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,
  ...
def self.build_from_xml
工作=[]
input_file=“#{JOB_DIR}/1.xml”
doc=XML::Document.file(输入文件)
doc.find('//execution_record')。每个do |节点|
作业节点.find('jobid')。到_a.first.content,
:user=>node.find('user')。到_a.first.content,
...

Rails过去有一个自己的
find_all
方法从数据库中检索所有现有记录,因此您的方法名称可能有点误导。Rails倾向于使用build动词来表示创建一个新的模型对象,但还没有保存它,所以我用了一个类似于
build\u from\u xml

谢谢你,Mikej,这非常有用@jalagrange我知道你已经接受了答案,但我觉得我没有帮你那么多-当你进一步了解时,请随时发布任何后续问题。
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,
  ...