Rails 3 after_save旧值

时间:2012-09-17 16:24:32

标签: ruby-on-rails-3 activerecord

如何使用正在更新的记录的旧值?

例如在下面的代码块中,在确定它确实已经改变之后,如何使用之前的winner_id字段运行查询?

if self.winner_id_changed?
   old_value = self.changed_attributes
   User.find(old_value)
   #do stuff with the old winner....
end

self.changed_attributes的示例输出为:

  

{ “winner_id”=→6}

我是否真的必须将其转换为字符串并解析该值才能对其执行查询? old_value[:winner_id]似乎没有做任何事情。

1 个答案:

答案 0 :(得分:6)

使用where代替find,并使用以下注入方法对更改生成所需的哈希:

if self.winner_id_changed?
   old_value = self.changes.inject({}) { |h, (k,v)| h[k] = v.first }
   old_user = User.where(old_value)
   #do stuff with the old user....
end

您还可以使用ActiveRecord脏方法,例如:

self.winner_id_was

获取特定属性的旧值。可以找到完整的文档here