0

我有一个用于管理大公司员工的数据库。每个部门负责管理自己的数据。所以我有 StaffDepartment模型如下所示:

class Staff < ApplicationRecord
  belongs_to :department

  validates :national_id, presence: true,
    uniqueness: { scope: [:department_id] }  
end
class Department < ApplicationRecord
  has_many :staffs

end

一名员工可以在多个部门工作。因此,在更新数据时,系统应该检查一个员工的部门和national_id,然后继续更新数据。这就是为什么我要在 department_id 的范围内验证 national_id。我还在staffs表上实施了唯一性索引,如下所示:

class AddUniqueIndexToStaffs < ActiveRecord::Migration[5.1]
  def change
    add_index :staffs, [:national_id, :department_id], unique: true
  end
end

在导入 CSV 时,我使用了以下方法:

def load_imported_staffs
    spreadsheet = open_spreadsheet
    spreadsheet.default_sheet = 'Staff'
    header = spreadsheet.row(2)
    (3..spreadsheet.last_row).map do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose]
      staff = Staff.find_by(national_id:row["national_id"], department_id: row["department_name"]) || Staff.new
      staff.attributes = row.to_hash.slice("name", "national_id", "department_name")
      staff
    end
  end

由于员工可以在不同的部门工作,我的想法是find_by同时使用national_id和department_id,以确保在导入过程中不会更新错误的员工,以防在另一个部门发现相同的national_id。

这是我的 CSV:

在此处输入图像描述

当我导入 CSV 时,更新中止并出现错误:

Row : national_id has already been taken

对于所有行。该脚本无法更新现有数据。我哪里错了?我喜欢 Rails,但我是一个初学者,已经花了几个小时在这上面,但似乎没有办法。提前致谢。

4

0 回答 0