Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatija Čupić <matteeyah@gmail.com>2018-02-13 16:51:44 +0300
committerMatija Čupić <matteeyah@gmail.com>2018-02-13 17:17:26 +0300
commit532a966410ad00264376bfd071c87193b97a289b (patch)
tree7e381bf1d283a548613db349f4e87f933cefe925 /app/validators
parent41285af45d086ded796c6e05eed31890df69d825 (diff)
Extend variables_duplicates validator with scope handling
Diffstat (limited to 'app/validators')
-rw-r--r--app/validators/variable_duplicates_validator.rb15
1 files changed, 13 insertions, 2 deletions
diff --git a/app/validators/variable_duplicates_validator.rb b/app/validators/variable_duplicates_validator.rb
index 8a9d8892e9b..9c7fa86ed5b 100644
--- a/app/validators/variable_duplicates_validator.rb
+++ b/app/validators/variable_duplicates_validator.rb
@@ -1,11 +1,22 @@
# VariableDuplicatesValidator
#
-# This validtor is designed for especially the following condition
+# This validator is designed for especially the following condition
# - Use `accepts_nested_attributes_for :xxx` in a parent model
# - Use `validates :xxx, uniqueness: { scope: :xxx_id }` in a child model
class VariableDuplicatesValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
- duplicates = value.reject(&:marked_for_destruction?).group_by(&:key).select { |_, v| v.many? }.map(&:first)
+ if options[:scope]
+ scoped = value.group_by { |variable| Array(options[:scope]).map { |attr| variable.send(attr) } }
+ scoped.each_value { |scope| validate_duplicates(record, attribute, scope) }
+ else
+ validate_duplicates(record, attribute, value)
+ end
+ end
+
+ private
+
+ def validate_duplicates(record, attribute, values)
+ duplicates = values.reject(&:marked_for_destruction?).group_by(&:key).select { |_, v| v.many? }.map(&:first)
if duplicates.any?
record.errors.add(attribute, "Duplicate variables: #{duplicates.join(", ")}")
end