我目前正在尝试从一个记录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
感谢您的帮助......谢谢!
答案 0 :(得分:1)
我不确定您看到的错误消息的原因,因为我无法看到您尝试调用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
方法来从数据库中检索所有现有记录,因此您的方法名称可能有点误导。 Rails倾向于使用 build 动词来表示创建一个新的模型对象但是还没有保存它这就是为什么我的名字就像{{1} }。