如何检测模型的属性更改?
我想在保存模型后执行的rails中创build一个callback函数。
我有这个模型,声称有一个属性“状态”根据索赔的状态而变化,可能的值是悬而未决,认可,批准,拒绝
数据库具有“状态”,其默认值为“挂起”。
我想在第一次创build模型之后执行某些任务,或者从一个状态更新到另一个状态,具体取决于它从哪个状态转换而来。
我的想法是在模型中有一个function:
after_save :check_state def check_state # if status changed from nil to pending (created) do this # if status changed from pending to approved performthistask end
我的问题是如何检查模型内的更改前的以前的值?
你应该看看ActiveModel :: Dirty模块:你应该能够在你的Claim模型上执行以下操作:
claim.status_changed? # returns true if 'status' attribute has changed claim.status_was # returns the previous value of 'status' attribute claim.status_change # => ['old value', 'new value'] returns the old and # new value for 'status' attribute claim.name = 'Bob' claim.changed # => ["name"] claim.changes # => {"name" => ["Bill", "Bob"]}
哦! Rails的喜悦!
你可以使用这个
self.changed
它将返回在此logging中更改的所有列的数组
你也可以使用
self.changes
它返回一个散列的变化,并在结果之前和之后作为数组
我build议你看看其中一个可用的状态机插件:
- acts_as_state_machine
- alter_ego
任何一个都可以让你设置状态和状态之间的转换。 处理您的要求非常有用和简单的方法。
我看到这个问题在很多地方都出现了,所以我为它写了一个小小的rubygem,使代码更好一些(并且避免了在任何地方有一百万条if / else语句): https : //github.com/ronna-s / on_change 。 我希望有帮助。
使用经过良好testing的解决scheme,比如state_machine gem,你会好得多。