summaryrefslogtreecommitdiff
path: root/config/initializers/1_acts_as_taggable.rb
diff options
context:
space:
mode:
Diffstat (limited to 'config/initializers/1_acts_as_taggable.rb')
-rw-r--r--config/initializers/1_acts_as_taggable.rb33
1 files changed, 33 insertions, 0 deletions
diff --git a/config/initializers/1_acts_as_taggable.rb b/config/initializers/1_acts_as_taggable.rb
index 59412aef755..0c34bf3941b 100644
--- a/config/initializers/1_acts_as_taggable.rb
+++ b/config/initializers/1_acts_as_taggable.rb
@@ -15,3 +15,36 @@ raise "Counter cache is not disabled" if
model.connection_specification_name = Ci::ApplicationRecord.connection_specification_name
model.singleton_class.delegate :connection, :sticking, to: '::Ci::ApplicationRecord'
end
+
+# Modified from https://github.com/mbleigh/acts-as-taggable-on/pull/1081
+# with insert_all, which is not supported in MySQL
+# See https://gitlab.com/gitlab-org/gitlab/-/issues/338346#note_996969960
+module ActsAsTaggableOnTagPatch
+ def find_or_create_all_with_like_by_name(*list)
+ list = Array(list).flatten
+
+ return [] if list.empty?
+
+ existing_tags = named_any(list)
+
+ missing = list.reject do |tag_name|
+ comparable_tag_name = comparable_name(tag_name)
+ existing_tags.find { |tag| comparable_name(tag.name) == comparable_tag_name }
+ end
+
+ if missing.empty?
+ new_tags = []
+ else
+ attributes_to_add = missing.map do |tag_name|
+ { name: tag_name }
+ end
+
+ insert_all(attributes_to_add, unique_by: :name)
+ new_tags = named_any(missing)
+ end
+
+ existing_tags + new_tags
+ end
+end
+
+::ActsAsTaggableOn::Tag.singleton_class.prepend(ActsAsTaggableOnTagPatch)