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

标签 mysql ruby-on-rails xml parsing libxml2

我目前正在尝试读取 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/

相关文章:

php - MySQL 连接查询

zip 数组的 mySQL 查询优化

ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样?

ios - 如何快速解析XMPPMessage中的xml?

mysql - Grails 应用程序中 MySql 的管道异常

mysql - 提高该查询的效率: Update With Joins and Subqueries

ruby-on-rails - Heroku/Unicorn 上的重复出现 rails 错误 - 'execution expired',一个 ActionView::Template::Error

ruby-on-rails - 如何使用 Ruby on Rails 优化 'string.split("&").sort.join("&")'?

c# - XPath 选择具有特定属性值的元素?

xml - 在 Android Studio 中使用 ctrl+space 在 xml 布局中不显示建议