Mysql Ruby libxml解析和插入到数据库
我目前正在尝试读取一个xml文件,该文件记录PBS上的作业。我已成功解析代码,但无法将对象插入数据库,我收到以下错误: “当你没有预料到的时候,你有一个零对象! 您可能希望有ActiveRecord::Base的实例。 计算nil时出错。删除“ 这是我的模型: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, :
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,
...