Chr*_*ier 5 validation ruby-on-rails
我有一个名为lifecycle_id的表,另一个名为lifecycle_change_reason.lifeycle_id通常由系统根据其他因素自动更改,但某些用户可以手动更改生命周期.如果他们这样做,我想要求他们提供改变的理由,但我不想在任何其他时间要求该字段.有没有人建议我如何进行这种类型的验证?
谢谢 :)
-C
我可以看到几种不同的方式。我认为最好的方法是在表中添加另一个字段,称为lifecycle_id_original. 然后你的模型将包含这样的代码:
class Member < ActiveRecord::Base
belongs_to :lifecycle
validates :lifecycle_change_reason, :if => :lifecycle_changed?
before_save :reset_original_lifecycle
protected
def lifecycle_changed?
self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil?
end
def reset_original_lifecycle
self.lifecycle_id_original = self.lifecycle_id
end
end
Run Code Online (Sandbox Code Playgroud)
当验证对象(本例中的成员)时,仅当原始和lifecycle_id不相同时才需要lifecycle_change_reason。原始记录也允许使用 nil 值,因为这就是新创建记录时的值。
然后,当保存时,“原始”被设置为与lifecycle_id匹配,因此下一个更新周期将正常工作。
这并不像我想要的那么干净。我的第一个想法是使用 an attr_accessor,这样重复项就不会一直存储在数据库中,但这意味着每次加载记录时都设置该值。我不知道 ActiveRecord 模型有任何 on_load 样式回调。
| 归档时间: |
|
| 查看次数: |
1374 次 |
| 最近记录: |