Nested models and parent validation

前端 未结 2 1965
一向
一向 2020-12-04 10:35

I\'ve got two models.
- Parent has_many Children;
- Parent accepts_nested_attributes_for

相关标签:
2条回答
  • 2020-12-04 10:41

    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
      end
    end
    
    0 讨论(0)
  • 2020-12-04 11:03

    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.

    0 讨论(0)
提交回复
热议问题