1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
# frozen_string_literal: true
module Ci
class Tag < Ci::ApplicationRecord
include Gitlab::SQL::Pattern
self.table_name = :tags
has_many :taggings, dependent: :destroy, class_name: 'Ci::Tagging' # rubocop:disable Cop/ActiveRecordDependent -- existing
validates :name, presence: true
validates :name, uniqueness: { case_sensitive: true }
validates :name, length: { maximum: 255 }
scope :named, ->(name) { where(name: name) }
scope :named_like, ->(name) { fuzzy_search(name, [:name]) }
scope :named_any, ->(list) do
list.map { |name| named(name) }.reduce(:or)
end
scope :for_context, ->(context) do
joins(:taggings)
.where(taggings: { context: context })
.select("DISTINCT tags.*")
end
def self.find_or_create_with_like_by_name(name)
find_or_create_all_with_like_by_name([name]).first
end
def self.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|
existing_tags.find { |tag| tag.name == 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
def ==(other)
super || (other.is_a?(Tag) && name == other.name)
end
def to_s
name
end
end
end
|