13

属性が変更されていない場合(おそらくアクティブなレコードダーティの一部として)レールがデータベースにコミットしないことをどこかで読んだことを覚えているようです。私はそれを見つけることができないようで、ソースコードをざっと見ても賢明ではありません。

これが false の場合、変更が発生したかどうかに基づいてコードを実行したいので、 before_save コールバックを使用する必要があります。

ダーティデータを含む after_save は機能しないと思いますか??

4

1 に答える 1

23

Rails は実行しませんが、何も変更されていなくてもコールバックUPDATEを実行します。after_save

pry $ u = User.first
=> #<User id: 1, email: "dave@davebryand.com", username: "dbryand"...
pry $ u.updated_at
=> Tue, 24 Jun 2014 18:36:04 UTC +00:00
pry $ u.changed?
=> false
pry $ u.save
From: /Users/dave/Projects/sample/app/models/user.rb @ line 3 :

    1: class User < ActiveRecord::Base
    2:
 => 3:   after_save -> { binding.pry }

pry $ exit
=> true
pry $ u.updated_at
=> Tue, 24 Jun 2014 18:36:04 UTC +00:00

の特定の属性の変更に応じて何かをしたい場合は、次のようにbefore_saveします。

pry $ u = User.first
=> #<User id: 1, email: "dave@davebryand.com", username: "dbryand"...
pry $ u.save
=> true
pry $ u.name = "John Doe"
=> "John Doe"
pry $ u.save
From: /Users/dave/Projects/sample/app/models/user.rb @ line 3 :

    1: class User < ActiveRecord::Base
    2:
 => 3:   before_save -> { binding.pry if name_changed? }

汚いドキュメントはこちら: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

于 2014-06-25T15:40:51.950 に答える