使用以下Ruby on Rails模型" Foo":
class Foo < ActiveRecord::Base
has_many :bars
accepts_nested_attributes_for :bars
def bar_value_total
self.bars.sum(:value) #TODO: must verify this is in range (0.0 .. 100.0)
end
end
并将Bar作为具有单个值属性的简单模型:
class Bar < ActiveRecord::Base
validates :value, :inclusion => { :in => 0.0..100.0 }, :presence => true
end
如果总条形中的值不在指定范围内(0.0 ... 100.0),如何添加验证以防止保存Foo?
例如,如果Foo有三个条形,其值为40.0和50.0,则当第三个条形添加超过10.0时,保存尝试将失败。
如果Foo已经有一个值为100.0的Bar,那么如果添加任意值超过0.0的Bar,则Save尝试失败。
<小时/> 更新: 我为Bar模型添加了一个自定义验证(并且它可以工作)......但它看起来有点笨拙。是否有更好的&#34; Rails方式&#34;比这个?
class Bar < ActiveRecord::Base
validates :value, :inclusion => { :in => 0.0..100.0 }, :presence => true
validate :bar_totals_are_within_range
private
def bar_totals_are_within_range
if !self.foo.bar_value_total + self.value - self.value_was).between?(0.0, 100.0)
errors.add(:base, "Total bar value exceeded")
end
end
end
答案 0 :(得分:0)
我会说:
accepts_nested_attributes_for :bars, :reject_if => :any_invalid_bar?
def any_invalid_bar?
bars.any? &:invalid?
end
这样,在保存一个Bar
之前,使用Bar
中的任何验证验证每个Foo
。