mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-14 13:16:28 +08:00
56 lines
2 KiB
Ruby
56 lines
2 KiB
Ruby
namespace :protocol_keyword_team do
|
|
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|
|
|
new_keywords = []
|
|
protocol.protocol_keywords.find_each do |protocol_keyword|
|
|
next if protocol.team_id == protocol_keyword.team_id
|
|
# remove protocol keyword from protocol
|
|
ProtocolProtocolKeyword.where(
|
|
protocol_id: protocol.id,
|
|
protocol_keyword_id: protocol_keyword.id
|
|
).destroy_all
|
|
# create new keyword with correct team
|
|
new_keywords << ProtocolKeyword.create(
|
|
name: protocol_keyword.name,
|
|
team_id: protocol.team_id
|
|
)
|
|
end
|
|
# 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
|