1

假设我有一个名为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 直接从数据库中检索这些值,并且没有考虑表单传递的内容。你能帮助我吗?谢谢!

4

0 回答 0