Nested models and parent validation
This will probably work for you, but I have a feeling there's a much better answer out there. It sounds like a bug to me.
class Parent < ActiveRecord::Base validate :must_have_children def must_have_children if children.empty? || children.all?(&:marked_for_destruction?) errors.add(:base, 'Must have at least one child') end endend
It's not a bug. Acording to the documentation
Validates that the specified attributes are not blank (as defined by Object#blank?)
and validates :children, :presence => true
is just the the same. The documentation doesn't say what happens if you try to use it on an association. You should use custom validation using validate
.
Using validates_presence_of
on has_many
association calls blank?
on association children
, which is an object of class Array. Since the blank?
is not defined for an Array
, it fires method_missing
which is caught inside Rails. Usually it do what you wants but I found it fails in Rails 3.1rc and Ruby 1.8.7 in a really awful way: it silently reverts the changes of associated records. It took me a couple of hours to find out what's happening.