2011-09-20 7 views
4

についてafter_update、私のモデルです。列の古い値を取得するにはどうすればよいですか?コールバックの列の古い値を取得する方法は?

+2

'* _was'方法があります。例えば。 'object.column_name_was'ですが、私はこれが更新後に動作するとは思わない。 – Mischa

+0

です。すべてのActiveRecordライフサイクルコールバックは、トランザクション内で実行されます。コミットは、すべてのコールバックがtrueを返す場合にのみ実行されます。そして、明らかに、モデルは実際のコミットが完了するまで古い値を保持します。 – compostus

+0

@ミシャ:いいえ、あなたが正しいです。それが利用可能になります。 –

答えて

7

changed_attributes()モデルのメソッドは、変更された属性のハッシュを元の値(after_udpate)で取得します。より多くの情報と関連する方法here

class MyModel < ActiveRecord::Base 
    after_update :log_changed 

    def log_changed 
    puts "changed attributes:" 
    puts changed_attributes.inspect 
    end 
end 

は...コンソールに次のようになります:

$ rails console 
Loading development environment (Rails 3.0.7) 
test(dev)> m = MyModel.first 
=> #<MyModel id: 134611365, name: "oldname", created_at: "2011-09-16 10:27:53", updated_at: "2011-09-20 11:58:11"> 
test(dev)> m.name = 'newname' 
=> "newname" 
test(dev)> m.save 
    SQL (0.2ms) BEGIN 
    SQL (0.4ms) SHOW TABLES 
    AREL (0.2ms) UPDATE `mymodels` SET `updated_at` = '2011-09-20 12:07:34', `name` = 'newname' WHERE `mymodels`.`id` = 134611365 
changed attributes: 
{"name"=>"oldname", "updated_at"=>Tue, 20 Sep 2011 11:58:11 UTC +00:00} 
    SQL (83.9ms) COMMIT 
=> true 
test(dev)> m.changed_attributes 
=> {} 
関連する問題