У меня есть база данных для управления персоналом в крупной компании. Каждый отдел отвечает за управление своими собственными данными. Итак, у меня есть модели Staff
и Department
, как показано ниже:
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 персонала, а затем приступит к обновлению данных. Вот почему я проверяю national_id с областью действия Department_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
для все ряды. Сценарий не может обновить существующие данные. Куда я иду не так? Я люблю рельсы, но я новичок, потратил на это часы и, похоже, не могу найти дорогу. Заранее спасибо.