首页 > 解决方案 > ActiveModel::UnknownAttributeError: WorkOrder 的未知属性“”

问题描述

我做了一个 rake 任务,它应该导入我通过将 3 个 CSV 文件与 Pandas 和 Python 合并制作的 CSV 文件(我是 Ruby 和 Rails 的新手,所以这就是我在这部分使用 Pandas 的原因)。

这是我创建的 rake 任务,rails generate task import import_csv当我运行时可以看到它rake -T

namespace :import do
  desc "Import finalCsv.csv into database"
  task import_csv: :environment do
    require 'csv'
    filename = "#{Rails.root}/db/finalCsv.csv"
    CSV.foreach(filename, headers: true) do |row|
        WorkOrder.create!(row.to_hash)
    end
  end
end

这是我将 3 个原始 CSV 合并在一起的 python 脚本。

import pandas as pd

locations = pd.read_csv("locations.csv")
technicians = pd.read_csv("technicians.csv")
workOrders = pd.read_csv("work_orders.csv")

workOrders = workOrders.merge(technicians, how="inner", left_on="technician_id", right_on="id")
workOrders = workOrders.merge(locations, how="right", left_on="location_id", right_on="id")

workOrders = workOrders.rename(columns={"name_x": "Full Name", "name_y": "Company"})
workOrders = workOrders.drop(labels = ["id_x", "id_y", "id"], axis=1)

finalCsv = workOrders.to_csv("finalCsv.csv", encoding="utf-8")
print(finalCsv)

此外,这里是我的迁移和架构文件。

移民:

  def change
    create_table :work_orders do |t|
      t.integer :technician_id
      t.integer :location_id
      t.time :time
      t.integer :duration
      t.integer :price
      t.string :FullName
      t.string :Company
      t.string :City

      t.timestamps
    end
  end
end

架构:


  create_table "work_orders", force: :cascade do |t|
    t.integer "technician_id"
    t.integer "location_id"
    t.time "time"
    t.integer "duration"
    t.integer "price"
    t.string "FullName"
    t.string "Company"
    t.string "City"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end

最后,当我运行WorkOrder.all(我的模型)或WorkOrder.new在 rails 控制台中时,两者都是有效的,所以我对这里出了什么问题感到有些困惑。有任何想法吗?

标签: pythonruby-on-railsrubypandassqlite

解决方案


向大家致谢。我最终修改了我的 Python 脚本,以便在将 Pandas 数据帧写入 CSV 时没有 id 列。然后我又遇到了一些无法预料的问题......我最终重新生成了我的模型并重新开始。


推荐阅读