52

次の間に違いはありますか:

after_create :after_createafter_commit :after_commit_on_create, :on => :create

これらは同じ意味で使用できますか?

4

3 に答える 3

100

それらは交換可能ではありません。主な違いは、コールバックが実行されるタイミングです。の場合、これは常に(または)after_createへの呼び出しが戻る前になります。savecreate

Railssaveはトランザクション内ですべてをラップし、作成前/作成後のコールバックはそのトランザクション内で実行されます (この結果、 after_create で例外が発生した場合、保存はロールバックされます)。ではafter_commit、最も外側のトランザクションがコミットされるまでコードは実行されません。これは、作成されたトランザクション レールまたはユーザーが作成したものです (たとえば、1 つのトランザクション内で複数の変更を行いたい場合)。

実行した時点after_save/createで、保存はロールバックされる可能性があり、(デフォルトでは) 他のデータベース接続 (sidekiq などのバックグラウンド タスクなど) からは見えません。通常、これら 2 つの組み合わせが を使用する動機となりafter_commitます。

于 2013-04-01T23:53:57.087 に答える
5

There is one major difference between these two with respect to associations. after_create is called as soon as an insert query is fired for the given object, and before the insert queries of the associations of the object. This means the values of the associated objects can be changed directly in after_create callbacks without update query.

class Post < ActiveRecord::Base
  has_one :post_body
  after_create :change_post_body

  def change_post_body
    self.post_body.content = "haha"
    #No need to save
  end 
end
于 2015-10-23T07:26:47.653 に答える