2

更新中のレコードの古い値をどのように処理しますか?

たとえば、次のコード ブロックでは、以前の 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]何もしないようです。

4

1 に答える 1

7

find の代わりに where を使用し、変更に対して次の inject メソッドを使用して、目的のハッシュを生成します。

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

特定の属性の古い値を取得します。完全なドキュメントはここにあります。

于 2012-09-17T16:27:05.733 に答える