Rails 3 after_save旧值

Noz*_*Noz 1 activerecord ruby-on-rails-3

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

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

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

输出的示例self.changed_attributes将是:

{ "winner_id"=> 6}

我是否真的必须将其转换为字符串并解析该值才能对其执行查询?old_value[:winner_id]好像什么也没做.

Ere*_*bih 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
Run Code Online (Sandbox Code Playgroud)

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

self.winner_id_was
Run Code Online (Sandbox Code Playgroud)

获取特定属性的旧值.完整的文档可以在这里找到.