gpt4 book ai didi

mysql - Ruby libxml 解析并插入数据库

转载 作者:行者123 更新时间:2023-11-29 15:00:33 25 4
gpt4 key购买 nike

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

“当你没有预料到的时候,你得到了一个 nil 对象!您可能期望一个 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

我的模型 Controller :

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

如果有任何帮助,我将不胜感激...谢谢!

最佳答案

我不确定您看到的错误消息的原因,因为我看不到您尝试调用 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 动词来表示创建一个新的模型对象,但还不保存它,所以这就是为什么我使用像 build_from_xml 这样的名称.

关于mysql - Ruby libxml 解析并插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com