diff options
Diffstat (limited to 'config/initializers/1_acts_as_taggable.rb')
-rw-r--r-- | config/initializers/1_acts_as_taggable.rb | 33 |
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) |