验证has_many关系中的属性总和

时间:2014-09-16 15:43:13

标签: ruby-on-rails validation associations

使用以下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

1 个答案:

答案 0 :(得分:0)

我会说:

  accepts_nested_attributes_for :bars, :reject_if => :any_invalid_bar?

  def any_invalid_bar?
    bars.any? &:invalid?
  end

这样,在保存一个Bar之前,使用Bar中的任何验证验证每个Foo