同时验证许多对象

时间:2012-04-16 20:10:26

标签: ruby-on-rails-3 validation model

假设我有一个名为SchoolYear的模型。这个模型有很多个时期。当我想创建一个评估结构时,它会自动创建三个具有默认值的句点。

class SchoolYear < ActiveRecord::Base

  has_many :periods, :dependent => :destroy

  ...

end

稍后,我有一个视图,其中用户可以更新所有这3个时段以及学年(表单基于学年)。句点具有状态字段,可以是活动的,不活动的或已完成的。创建学年时,其期间状态的默认值为无效

class Period < ActiveRecord::Base

  ACTIVE = 1
  INACTIVE = 2
  FINISHED = 3

  belongs_to :school_year

  validates_inclusion_of :status, :in => [ACTIVE, INACTIVE, FINISHED]

end

在更新学年时,学年中至少有一个学期需要处于活跃状态。我该如何验证?如果我尝试在SchoolYear模型中执行此操作,则其所有句点仍将具有默认值。在Period模型中,只有当前期间(self)具有其新值。在检查其他期间时,它们都具有默认值。它们确实得到了更新,但我的意思是,当我尝试验证我想要的内容时,它们仍然显示它们的旧值,因为它们仍未在数据库中更新,并且Rails不会在内存中查找它们的值。

例如,如果我想在SchoolYear模型中进行此验证,我可能会这样:

class SchoolYear < ActiveRecord::Base

  validate :at_least_one_active_period, :on => :update

  def at_least_one_active_period
    self.errors.add(:periods_error, "Period Error") unless self.periods.where(:status => Period::ACTIVE).count == 1
  end

end

这不起作用,因为正如我所说,Rails直接从数据库中检索这些值,并没有考虑表单传递的内容。你能帮助我吗?谢谢!

0 个答案:

没有答案