From 76f676879cf7cf9e7c3b90ac36dddf04a8521bd6 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 12 Dec 2019 13:10:46 -0500 Subject: [PATCH] FIX: Constraint error when inserting the same topic group twice If that happens, update the value instead of raising an error. --- app/models/topic_group.rb | 13 +++++++++---- spec/models/topic_group_spec.rb | 7 +++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/models/topic_group.rb b/app/models/topic_group.rb index a2c60e1f5f2..ad3219e14dc 100644 --- a/app/models/topic_group.rb +++ b/app/models/topic_group.rb @@ -41,14 +41,19 @@ class TopicGroup < ActiveRecord::Base query = <<~SQL INSERT INTO topic_groups (topic_id, group_id, last_read_post_number, created_at, updated_at) SELECT tag.topic_id, tag.group_id, :post_number, :now, :now - FROM topic_allowed_groups tag - INNER JOIN group_users gu ON gu.group_id = tag.group_id - WHERE gu.user_id = :user_id - AND tag.topic_id = :topic_id + FROM topic_allowed_groups tag + INNER JOIN group_users gu ON gu.group_id = tag.group_id + WHERE gu.user_id = :user_id + AND tag.topic_id = :topic_id SQL query += 'AND NOT(tag.group_id IN (:already_updated_groups))' unless updated_group_ids.length.zero? + query += <<~CONFLICT + ON CONFLICT(topic_id, group_id) + DO UPDATE SET last_read_post_number = :post_number, created_at = :now, updated_at = :now + CONFLICT + DB.exec( query, user_id: user.id, topic_id: topic_id, post_number: post_number, now: DateTime.now, already_updated_groups: updated_group_ids diff --git a/spec/models/topic_group_spec.rb b/spec/models/topic_group_spec.rb index 4eb5264595d..efe33fd932d 100644 --- a/spec/models/topic_group_spec.rb +++ b/spec/models/topic_group_spec.rb @@ -81,5 +81,12 @@ describe TopicGroup do expect(created_topic_group.last_read_post_number).to eq new_post_number expect(created_topic_group2.last_read_post_number).to eq topic2.highest_post_number end + + it "will not raise an error if a topic group already exists" do + TopicGroup.create_topic_group(user, @topic.id, 3, []) + expect(TopicGroup.find_by(group: group, topic: @topic).last_read_post_number).to eq(3) + TopicGroup.create_topic_group(user, @topic.id, 10, []) + expect(TopicGroup.find_by(group: group, topic: @topic).last_read_post_number).to eq(10) + end end end