diff options
author | Matija Čupić <matteeyah@gmail.com> | 2018-02-13 14:51:44 +0100 |
---|---|---|
committer | Matija Čupić <matteeyah@gmail.com> | 2018-02-13 15:17:26 +0100 |
commit | 532a966410ad00264376bfd071c87193b97a289b (patch) | |
tree | 7e381bf1d283a548613db349f4e87f933cefe925 /app/validators | |
parent | 41285af45d086ded796c6e05eed31890df69d825 (diff) | |
download | gitlab-ce-532a966410ad00264376bfd071c87193b97a289b.tar.gz |
Extend variables_duplicates validator with scope handling
Diffstat (limited to 'app/validators')
-rw-r--r-- | app/validators/variable_duplicates_validator.rb | 15 |
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 |