ActiveModel::UnknownAttributeError: WorkOrder 的未知属性“”

Posted

技术标签:

【中文标题】ActiveModel::UnknownAttributeError: WorkOrder 的未知属性“”【英文标题】:ActiveModel::UnknownAttributeError: unknown attribute '' for WorkOrder 【发布时间】:2021-11-13 06:06:59 【问题描述】:

我有一个 rake 任务,它应该导入我通过将 3 个 CSV 文件与 Pandas 和 Python 合并创建的 CSV 文件(我是 Ruby 和 Rails 的新手,所以这就是我使用 Pandas 的原因) .

这是我使用 rails generate task import import_csv 创建的 rake 任务,当我运行 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

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

【问题讨论】:

【参考方案1】:

错误告诉您您正在尝试添加属性""。例如,WorkOrder.new("" => "foo") 应该会产生相同的错误。

WorkOrder.create!(row.to_hash)检查row,其中一个键是空白的。您的 CSV 列之一可能缺少标题。

【讨论】:

【参考方案2】:

您的 CSV 可能包含没有标题的额外单元格。如果你 100% 肯定数据是正确的,你可以跳过额外的数据:

WorkOrder.create!(row.to_hash.except(''))

在您的 rake 任务的相应部分中。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于ActiveModel::UnknownAttributeError: WorkOrder 的未知属性“”的主要内容,如果未能解决你的问题,请参考以下文章