aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/validations
diff options
context:
space:
mode:
authorKassio Borges <kassioborgesm@gmail.com>2015-11-08 10:57:25 -0200
committerKassio Borges <kassioborgesm@gmail.com>2015-11-08 10:58:39 -0200
commitc8bbe9aefae3fdee1eebc8c3e95f5009f5148034 (patch)
treee4eab9384c95c45aefe223f41355a274f6bb909f /activerecord/lib/active_record/validations
parent25673f47b607528d12b0f4d1bace30b2c41a97fa (diff)
downloadrails-c8bbe9aefae3fdee1eebc8c3e95f5009f5148034.tar.gz
rails-c8bbe9aefae3fdee1eebc8c3e95f5009f5148034.tar.bz2
rails-c8bbe9aefae3fdee1eebc8c3e95f5009f5148034.zip
Improve support for non Active Record objects on `validates_associated`
Skipping `marked_for_destruction?` when the associated object does not responds to it make easier to validate virtual associations built on top of Active Model objects and/or serialized objects that implement a `valid?` instance method.
Diffstat (limited to 'activerecord/lib/active_record/validations')
-rw-r--r--activerecord/lib/active_record/validations/associated.rb10
1 files changed, 8 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/validations/associated.rb b/activerecord/lib/active_record/validations/associated.rb
index 32fbaf0a91..b14db85167 100644
--- a/activerecord/lib/active_record/validations/associated.rb
+++ b/activerecord/lib/active_record/validations/associated.rb
@@ -2,10 +2,16 @@ module ActiveRecord
module Validations
class AssociatedValidator < ActiveModel::EachValidator #:nodoc:
def validate_each(record, attribute, value)
- if Array.wrap(value).reject {|r| r.marked_for_destruction? || r.valid?}.any?
- record.errors.add(attribute, :invalid, options.merge(:value => value))
+ if Array(value).reject { |r| valid_object?(r) }.any?
+ record.errors.add(attribute, :invalid, options.merge(value: value))
end
end
+
+ private
+
+ def valid_object?(record)
+ (record.respond_to?(:marked_for_destruction?) && record.marked_for_destruction?) || record.valid?
+ end
end
module ClassMethods