"After_create" ve "after_save" arasındaki fark nedir ve hangisi ne zaman kullanılır?


124

Are after_createve after_saveişlevsellik başına aynı?

Hesap oluşturulduktan sonra bir kullanıcının e-postası ile işlem yapmak istiyorum.

Veritabanına kaydedildiğinde bu işlemi yapmak istiyorum.

hangisinin kullanılması tercih edilir: after_createveya after_save?

Yanıtlar:


212

after_create yalnızca bir kez çalışır - kayıt ilk oluşturulduktan hemen sonra.

after_save nesneyi her kaydettiğinizde çalışır - yıllar sonra onu güncelliyor olsanız bile

Bu nedenle, bu e-posta işlemini yalnızca bir kez yapmak istiyorsanız (ve sonra bir daha asla), o zaman kullanın after_create.

Bunu yapmak istiyorsanız her nesne kaydedilir zaman, o zaman bunu yapmakafter_save


2
okuyucular , belgelere göre , ActiveRecord'unupdate_allafter_*
user2426679

93

Gönderen docs :

after_create()

Base.saveHenüz kaydedilmemiş yeni nesnelere sonra çağrılır (kayıt yok).

after_save()

Sonra çağrılır Base.save (kayıt oluşturma veya güncelleme kaydı olup olmadığına bakılmaksızın).


1
after_save()

Çok sık kaydetmeyen modelleri kaydetmeniz gerektiğinde iyi çalışır. Kayıtları sık sık değiştirmenin bu özel örneği için kullanılması tavsiye edilir.

 after_commit()

eylem gerçekleştirilmeden önce modelin veritabanına kaydedildiğinden emin olun after_commit: calculate_credit_score

def calculate_credit_score
     #Call a Cron job
end

Kullanmayı tavsiye ediyorsun after_commitama nedenini açıklamıyorsun. Lütfen detaylandırır mısınız? after_commitOluşturma, güncelleme ve yok etme işlemlerinde çalıştığını unutmayın . Dokümanlar: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/… Yani bu, after_savekaydı yok ettikten sonra o cron_job'u çağırmakla aynı davranış değil mi? Veya operasyon durumunda, silinmiş bir kullanıcıya bir e-posta mı göndereceksiniz? after_commit
Kullanırken

after_commitbu CRUD işlemlerinde çalışır, bu nedenle e-posta bu durumda sık sık güncelleniyorsa, belirli bir geri arama için eylemi birleştirmek daha kolay olacaktır. Benim durumumda kullandımafter_commit : calculate_profile_update, on: :update
pensebien
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.