aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/validations/absence.rb
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2015-06-22 15:25:36 +0200
committerYves Senn <yves.senn@gmail.com>2015-06-22 15:45:08 +0200
commit30c9aa7883b5363ce3f50aa010a4245a418bca29 (patch)
tree8ee50c0e46c8411ace86100081959c4289eae887 /activerecord/lib/active_record/validations/absence.rb
parent73aa66342e685b21ece23192bcb0e79c069e962a (diff)
downloadrails-30c9aa7883b5363ce3f50aa010a4245a418bca29.tar.gz
rails-30c9aa7883b5363ce3f50aa010a4245a418bca29.tar.bz2
rails-30c9aa7883b5363ce3f50aa010a4245a418bca29.zip
AR absence validator respects `marked_for_destruction?`. Closes #20449.
Associated objects that were marked for destruction are considered absent.
Diffstat (limited to 'activerecord/lib/active_record/validations/absence.rb')
-rw-r--r--activerecord/lib/active_record/validations/absence.rb24
1 files changed, 24 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/validations/absence.rb b/activerecord/lib/active_record/validations/absence.rb
new file mode 100644
index 0000000000..2e19e6dc5c
--- /dev/null
+++ b/activerecord/lib/active_record/validations/absence.rb
@@ -0,0 +1,24 @@
+module ActiveRecord
+ module Validations
+ class AbsenceValidator < ActiveModel::Validations::AbsenceValidator # :nodoc:
+ def validate_each(record, attribute, association_or_value)
+ return unless should_validate?(record)
+ if record.class._reflect_on_association(attribute)
+ association_or_value = Array.wrap(association_or_value).reject(&:marked_for_destruction?)
+ end
+ super
+ end
+ end
+
+ module ClassMethods
+ # Validates that the specified attributes are not present (as defined by
+ # Object#present?). If the attribute is an association, the associated object
+ # is considered absent if it was marked for destruction.
+ #
+ # See ActiveModel::Validations::HelperMethods.validates_absence_of for more information.
+ def validates_absence_of(*attr_names)
+ validates_with AbsenceValidator, _merge_attributes(attr_names)
+ end
+ end
+ end
+end