次の間に違いはありますか:
after_create :after_create
とafter_commit :after_commit_on_create, :on => :create
これらは同じ意味で使用できますか?
次の間に違いはありますか:
after_create :after_create
とafter_commit :after_commit_on_create, :on => :create
これらは同じ意味で使用できますか?
それらは交換可能ではありません。主な違いは、コールバックが実行されるタイミングです。の場合、これは常に(または)after_create
への呼び出しが戻る前になります。save
create
Railssave
はトランザクション内ですべてをラップし、作成前/作成後のコールバックはそのトランザクション内で実行されます (この結果、 after_create で例外が発生した場合、保存はロールバックされます)。ではafter_commit
、最も外側のトランザクションがコミットされるまでコードは実行されません。これは、作成されたトランザクション レールまたはユーザーが作成したものです (たとえば、1 つのトランザクション内で複数の変更を行いたい場合)。
実行した時点after_save/create
で、保存はロールバックされる可能性があり、(デフォルトでは) 他のデータベース接続 (sidekiq などのバックグラウンド タスクなど) からは見えません。通常、これら 2 つの組み合わせが を使用する動機となりafter_commit
ます。
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