我有一个带嵌套属性的模型:
class Foo < ActiveRecord::Base
has_many :bar
accepts_nested_attributes_for :bar
end
工作正常。但是我想确保每一个Foo,我至少有两个Bar。
我无法在验证中访问bar_attributes
,因此我似乎无法对其进行验证。
有没有干净的方法呢?
答案 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