如何检测模型的属性更改?

我想在保存模型后执行的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,你会好得多。