7

ActiveRecord は、モデルが変更されておらず、挿入/更新クエリが生成されていない場合でも、save メソッドが呼び出されるたびに after_save コールバックを呼び出していました。

これは実際にはデフォルトの動作です。そして、それはほとんどの場合問題ありません。

しかし、一部の after_save コールバックは、モデルが実際に保存されたかどうかに影響されます。

モデルが実際に after_save に保存されたかどうかを判断する方法はありますか?

次のテスト コードを実行しています。

class Stage < ActiveRecord::Base
  after_save do
    pp changes
  end
end

s = Stage.first
s.name = "q1"
s.save!
4

2 に答える 2

7

ActiveRecord は、モデルが変更されておらず、挿入/更新クエリが生成されていない場合でも、save メソッドが呼び出されるたびに after_save コールバックを呼び出していました。

ActiveRecord は、レコードが変更されたかどうかに関係なく、レコードが正常に保存されるたびに :after_save コールバックを実行します。

# record invalid, after_save not triggered
Record.new.save

# record valid, after_save triggered
r = Record.new(:attr => value)

# record valid and not changed, after_save triggered
r.save

知りたいのは、レコードが保存されているかどうかではなく、レコードが変更されているかどうかです。これを使用して簡単に実現できますrecord.changed?

class Record

  after_save :do_something_if_changed

  protected

  def do_something_if_changed
    if changed?
      # ...
    end
  end
end
于 2010-02-04T18:13:48.060 に答える
6

保存後、保存されたオブジェクトが新しいオブジェクトかどうかを確認します

a = ModelName.new
a.id = 1
a.save
a.new_record?
#=> false
于 2012-12-08T21:42:12.570 に答える