Вы можете написать свой собственный валидатор на основе кода для встроенного валидатора.
Поиск исходного кода для validates_associated, мы видим, что он использует «AssociatedValidator».Исходный код для этого:
module ActiveRecord
module Validations
class AssociatedValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
return if (value.is_a?(Array) ? value : [value]).collect{ |r| r.nil? || r.valid? }.all?
record.errors.add(attribute, :invalid, options.merge(:value => value))
end
end
module ClassMethods
def validates_associated(*attr_names)
validates_with AssociatedValidator, _merge_attributes(attr_names)
end
end
end
end
Таким образом, вы можете использовать это в качестве примера для создания собственного валидатора, который выдает сообщения об ошибках вроде этого:
module ActiveRecord
module Validations
class AssociatedBubblingValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
(value.is_a?(Array) ? value : [value]).each do |v|
unless v.valid?
v.errors.full_messages.each do |msg|
record.errors.add(attribute, msg, options.merge(:value => value))
end
end
end
end
end
module ClassMethods
def validates_associated_bubbling(*attr_names)
validates_with AssociatedBubblingValidator, _merge_attributes(attr_names)
end
end
end
end
Вы можете поместить этот кодв инициализаторе что-то вроде /initializers/associated_bubbling_validator.rb
.
Наконец, вы должны выполнить проверку так:
class User < ActiveRecord::Base
validates_associated_bubbling :account
end
ПРИМЕЧАНИЕ: приведенный выше код полностью не проверен, но если это не такне работает, надеюсь, достаточно поставить вас на правильный путь