Проверка уникальности при обновлении без прерывания процесса обновления при импорте CSV Rails - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть база данных для управления персоналом в крупной компании. Каждый отдел отвечает за управление своими собственными данными. Итак, у меня есть модели 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:

enter image description here

Когда я импортирую CSV, обновление прерывается, и я получаю ошибку:

Row : national_id has already been taken

для все ряды. Сценарий не может обновить существующие данные. Куда я иду не так? Я люблю рельсы, но я новичок, потратил на это часы и, похоже, не могу найти дорогу. Заранее спасибо.

...