link_uniqueness_validator.rb 623 B

12345678910111213141516171819202122232425
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. class Validations::LinkUniquenessValidator < ActiveModel::Validator
  3. ATTRIBUTES = %i[
  4. link_object_source_id link_object_source_value
  5. link_object_target_id link_object_target_value
  6. link_type_id
  7. ].freeze
  8. ERROR_MESSAGE = __('Link already exists')
  9. def validate(record)
  10. return if !scope(record).exists?
  11. record.errors.add :base, ERROR_MESSAGE
  12. end
  13. private
  14. def scope(record)
  15. record
  16. .class
  17. .where(record.slice(ATTRIBUTES))
  18. .then { record.persisted? ? _1.where.not(id: record.id) : _1 }
  19. end
  20. end