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