diff options
author | Yves Senn <yves.senn@gmail.com> | 2015-06-22 15:25:36 +0200 |
---|---|---|
committer | Yves Senn <yves.senn@gmail.com> | 2015-06-22 15:45:08 +0200 |
commit | 30c9aa7883b5363ce3f50aa010a4245a418bca29 (patch) | |
tree | 8ee50c0e46c8411ace86100081959c4289eae887 /activerecord/lib/active_record | |
parent | 73aa66342e685b21ece23192bcb0e79c069e962a (diff) | |
download | rails-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')
-rw-r--r-- | activerecord/lib/active_record/validations.rb | 1 | ||||
-rw-r--r-- | activerecord/lib/active_record/validations/absence.rb | 24 |
2 files changed, 25 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/validations.rb b/activerecord/lib/active_record/validations.rb index e227212827..34d96b19fe 100644 --- a/activerecord/lib/active_record/validations.rb +++ b/activerecord/lib/active_record/validations.rb @@ -76,4 +76,5 @@ end require "active_record/validations/associated" require "active_record/validations/uniqueness" require "active_record/validations/presence" +require "active_record/validations/absence" require "active_record/validations/length" 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 |