validates_associated(*attr_names) public

Validates whether the associated object or objects are all valid themselves. Works with any kind of association.

  class Book < ActiveRecord::Base
    has_many :pages
    belongs_to :library

    validates_associated :pages, :library
  end

Warning: If, after the above definition, you then wrote:

  class Page < ActiveRecord::Base
    belongs_to :book

    validates_associated :book
  end

…this would specify a circular dependency and cause infinite recursion.

NOTE: This validation will not fail if the association hasn’t been assigned. If you want to ensure that the association is both present and guaranteed to be valid, you also need to use validates_presence_of.

Configuration options:

  • on Specifies when this validation is active (default is :save, other options :create, :update)
  • if - Specifies a method, proc or string to call to determine if the validation should

occur (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The method, proc or string should return or evaluate to a true or false value.

Show source
Register or log in to add new notes.
August 30, 2011 - (>= v3.0.0)
1 thank

Does not work for has_one associations

If you are using this to validate that a has_one association has been made with another object this will not work, as the test used in the AssociatedValidator #validates_each method tests for nil and then ignores this object.

To test for association with a has_one association you can use the following code:

validate do
  [:teacher, :book].each do |attr|
    errors.add(attr, "is required") if self.send(attr).nil?
  end
end
July 11, 2014
1 thank

Use this for has_one associations instead

I have confirmed that validates_associated doesn’t work with has_one associations, like @amasses said.

This however worked for me, so I recommend to use validates on the has_one association directly, like this:

class Book < ActiveRecord::Base
  has_one :cover, validates: true
end