4

我有一个带有嵌套属性的模型:

class Foo < ActiveRecord::Base
    has_many :bar
    accepts_nested_attributes_for  :bar
end

它工作正常。但是我想确保对于每个 Foo,我至少有两个 Bar。我无法bar_attributes在我的验证中访问,所以我似乎无法验证它。

有什么干净的方法吗?

4

3 回答 3

7
class Foo < ActiveRecord::Base
  has_many :bars
  accepts_nested_attributes_for  :bar

  def validate
    if self.bars.reject(&:marked_for_destruction?).length < 2
      self.errors.add_to_base("Must have at least 2 bars")
    end
  end
end

控制器将负责构建/更新条形图,因此您只需要查看是否足够。

于 2010-04-07T21:17:56.760 回答
2

托尼的回答实际上不会处理现有Foo 的酒吧被删除的情况。

由于父级 (Foo) 的验证发生在嵌套的子级 (Bars) 被销毁之前,因此 Foo 将通过验证,然后 bar 将被销毁并且不会向用户显示任何错误。

我会将其添加为评论,但到目前为止还没有足够的代表

于 2010-06-30T19:32:10.297 回答
1

以防万一看到这个需要它为 Rails 3 工作。我认为 add_to_base (托尼和杰里米使用)已被删除,所以它需要像这样:

class Foo < ActiveRecord::Base
  has_many :bars
  accepts_nested_attributes_for  :bar

  def validate
    if self.bars.reject(&:marked_for_destruction?).length < 2
      self.errors.add(:base, "Must have at least 2 bars")
    end
  end
end
于 2012-01-11T19:03:54.503 回答