验证嵌套属性的数量

时间:2010-04-07 21:10:53

标签: ruby-on-rails ruby nested-attributes

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

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

工作正常。但是我想确保每一个Foo,我至少有两个Bar。 我无法在验证中访问bar_attributes,因此我似乎无法对其进行验证。

有没有干净的方法呢?

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:2)

Tony的回答实际上无法处理删除现有 Foo栏的情况。

由于父项(Foo)的验证发生在嵌套子项(Bars)被销毁之前,Foo将通过验证,然后条形图将被销毁,并且不会向用户显示错误。

我将此添加为评论但截至目前没有足够的代表

答案 2 :(得分:1)

万一有人看到这个需要它适用于Rails 3.我认为add_to_base(Tony和Jeremy使用)已被删除所以它需要像这样:

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