diff --git a/app/models/protocol_keyword.rb b/app/models/protocol_keyword.rb index fbcf9ae07..82888a1e2 100644 --- a/app/models/protocol_keyword.rb +++ b/app/models/protocol_keyword.rb @@ -1,6 +1,7 @@ class ProtocolKeyword < ApplicationRecord auto_strip_attributes :name, nullify: false validates :name, + uniqueness: { scope: :team }, length: { minimum: Constants::NAME_MIN_LENGTH, maximum: Constants::NAME_MAX_LENGTH } validates :team, presence: true diff --git a/lib/tasks/protocol_keyword_team.rake b/lib/tasks/protocol_keyword_team.rake index cef7ddb53..20a4fbe37 100644 --- a/lib/tasks/protocol_keyword_team.rake +++ b/lib/tasks/protocol_keyword_team.rake @@ -1,5 +1,6 @@ namespace :protocol_keyword_team do - desc 'Fixes false team_id on protocol keyword entry [bug SCI-2257]' + desc 'Fixes false team_id on protocol keyword entry [bug SCI-2257] and ' \ + 'removes duplicates in the scope of team [bug SCI-2294]' task exec: :environment do puts '[SciNote] Start processing...' Protocol.find_each do |protocol| @@ -20,6 +21,36 @@ namespace :protocol_keyword_team do # append newly created keywords to protocol protocol.protocol_keywords << new_keywords end + + # remove duplicates + Team.find_each do |team| + ActiveRecord::Base.transaction do + keywords = team.protocol_keywords + names = keywords.pluck(:name) + duplicates_ids = [] + keywords.each do |keyword| + duplicates_ids << keyword.id if names.count(keyword.name) > 1 + end + + duplicates_ids.each do |id| + protocol_keyword = ProtocolKeyword.find_by_id(id) + next unless protocol_keyword + duplicates = keywords.where(name: protocol_keyword.name) + protocol_ids = duplicates.map { |k| k.protocols.pluck(:id) } + duplicates.destroy_all + new_protocol_keyword = ProtocolKeyword.create!( + name: protocol_keyword.name, + team_id: protocol_keyword.team_id + ) + protocol_ids.flatten.uniq.each do |protocol_id| + ProtocolProtocolKeyword.create!( + protocol_id: protocol_id, + protocol_keyword_id: new_protocol_keyword.id + ) + end + end + end + end puts '[SciNote] Done!' end end